Skip to content

Commit 03a3423

Browse files
committed
Merge branch '5.1.x'
2 parents 64d13c4 + 6e79dcd commit 03a3423

File tree

2 files changed

+64
-10
lines changed

2 files changed

+64
-10
lines changed

spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestPartMethodArgumentResolver.java

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -100,19 +100,12 @@ public Mono<Object> resolveArgument(
100100

101101
ReactiveAdapter adapter = getAdapterRegistry().getAdapter(parameter.getParameterType());
102102
if (adapter != null) {
103-
// Mono<Part> or Flux<Part>
104103
MethodParameter elementType = parameter.nested();
105-
if (Part.class.isAssignableFrom(elementType.getNestedParameterType())) {
106-
parts = (adapter.isMultiValue() ? parts : parts.take(1));
107-
return Mono.just(adapter.fromPublisher(parts));
108-
}
109-
// We have to decode the content for each part, one at a time
110-
if (adapter.isMultiValue()) {
111-
return Mono.just(decodePartValues(parts, elementType, bindingContext, exchange, isRequired));
112-
}
104+
return Mono.just(adapter.fromPublisher(
105+
Part.class.isAssignableFrom(elementType.getNestedParameterType()) ?
106+
parts : decodePartValues(parts, elementType, bindingContext, exchange, isRequired)));
113107
}
114108

115-
// <T> or Mono<T>
116109
return decodePartValues(parts, parameter, bindingContext, exchange, isRequired)
117110
.next().cast(Object.class);
118111
}

spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestPartMethodArgumentResolverTests.java

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
/**
6161
* Unit tests for {@link RequestPartMethodArgumentResolver}.
6262
* @author Rossen Stoyanchev
63+
* @author Ilya Lukyanovich
6364
*/
6465
public class RequestPartMethodArgumentResolverTests {
6566

@@ -131,6 +132,15 @@ public void listPerson() {
131132
assertThat(actual.get(1).getName()).isEqualTo("James");
132133
}
133134

135+
@Test // gh-23060
136+
public void listPersonNotRequired() {
137+
MethodParameter param = this.testMethod.annot(requestPart().notRequired()).arg(List.class, Person.class);
138+
MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder();
139+
List<Person> actual = resolveArgument(param, bodyBuilder);
140+
141+
assertThat(actual).isEmpty();
142+
}
143+
134144
@Test
135145
public void monoPerson() {
136146
MethodParameter param = this.testMethod.annot(requestPart()).arg(Mono.class, Person.class);
@@ -141,6 +151,15 @@ public void monoPerson() {
141151
assertThat(actual.block().getName()).isEqualTo("Jones");
142152
}
143153

154+
@Test // gh-23060
155+
public void monoPersonNotRequired() {
156+
MethodParameter param = this.testMethod.annot(requestPart().notRequired()).arg(Mono.class, Person.class);
157+
MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder();
158+
Mono<Person> actual = resolveArgument(param, bodyBuilder);
159+
160+
assertThat(actual.block()).isNull();
161+
}
162+
144163
@Test
145164
public void fluxPerson() {
146165
MethodParameter param = this.testMethod.annot(requestPart()).arg(Flux.class, Person.class);
@@ -154,6 +173,15 @@ public void fluxPerson() {
154173
assertThat(persons.get(1).getName()).isEqualTo("James");
155174
}
156175

176+
@Test // gh-23060
177+
public void fluxPersonNotRequired() {
178+
MethodParameter param = this.testMethod.annot(requestPart().notRequired()).arg(Flux.class, Person.class);
179+
MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder();
180+
Flux<Person> actual = resolveArgument(param, bodyBuilder);
181+
182+
assertThat(actual.collectList().block()).isEmpty();
183+
}
184+
157185
@Test
158186
public void part() {
159187
MethodParameter param = this.testMethod.annot(requestPart()).arg(Part.class);
@@ -177,6 +205,15 @@ public void listPart() {
177205
assertThat(partToUtf8String(actual.get(1))).isEqualTo("{\"name\":\"James\"}");
178206
}
179207

208+
@Test // gh-23060
209+
public void listPartNotRequired() {
210+
MethodParameter param = this.testMethod.annot(requestPart().notRequired()).arg(List.class, Part.class);
211+
MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder();
212+
List<Part> actual = resolveArgument(param, bodyBuilder);
213+
214+
assertThat(actual).isEmpty();
215+
}
216+
180217
@Test
181218
public void monoPart() {
182219
MethodParameter param = this.testMethod.annot(requestPart()).arg(Mono.class, Part.class);
@@ -188,6 +225,15 @@ public void monoPart() {
188225
assertThat(partToUtf8String(part)).isEqualTo("{\"name\":\"Jones\"}");
189226
}
190227

228+
@Test // gh-23060
229+
public void monoPartNotRequired() {
230+
MethodParameter param = this.testMethod.annot(requestPart().notRequired()).arg(Mono.class, Part.class);
231+
MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder();
232+
Mono<Part> actual = resolveArgument(param, bodyBuilder);
233+
234+
assertThat(actual.block()).isNull();
235+
}
236+
191237
@Test
192238
public void fluxPart() {
193239
MethodParameter param = this.testMethod.annot(requestPart()).arg(Flux.class, Part.class);
@@ -201,6 +247,15 @@ public void fluxPart() {
201247
assertThat(partToUtf8String(parts.get(1))).isEqualTo("{\"name\":\"James\"}");
202248
}
203249

250+
@Test // gh-23060
251+
public void fluxPartNotRequired() {
252+
MethodParameter param = this.testMethod.annot(requestPart().notRequired()).arg(Flux.class, Part.class);
253+
MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder();
254+
Flux<Part> actual = resolveArgument(param, bodyBuilder);
255+
256+
assertThat(actual.collectList().block()).isEmpty();
257+
}
258+
204259
@Test
205260
public void personRequired() {
206261
MethodParameter param = this.testMethod.annot(requestPart()).arg(Person.class);
@@ -278,7 +333,13 @@ void handle(
278333
@RequestPart("name") Flux<Part> partFlux,
279334
@RequestPart("name") List<Part> partList,
280335
@RequestPart(name = "anotherPart", required = false) Person anotherPerson,
336+
@RequestPart(name = "name", required = false) Mono<Person> anotherPersonMono,
337+
@RequestPart(name = "name", required = false) Flux<Person> anotherPersonFlux,
338+
@RequestPart(name = "name", required = false) List<Person> anotherPersonList,
281339
@RequestPart(name = "anotherPart", required = false) Part anotherPart,
340+
@RequestPart(name = "name", required = false) Mono<Part> anotherPartMono,
341+
@RequestPart(name = "name", required = false) Flux<Part> anotherPartFlux,
342+
@RequestPart(name = "name", required = false) List<Part> anotherPartList,
282343
Person notAnnotated) {}
283344

284345

0 commit comments

Comments
 (0)