Skip to content

Commit 83bfee9

Browse files
committed
Return null in case of no matching part even for array/collection parameter
Closes gh-25819
1 parent 50b9542 commit 83bfee9

File tree

2 files changed

+81
-17
lines changed

2 files changed

+81
-17
lines changed

spring-web/src/main/java/org/springframework/web/multipart/support/MultipartResolutionDelegate.java

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2019 the original author or authors.
2+
* Copyright 2002-2020 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -99,37 +99,53 @@ public static Object resolveMultipartArgument(String name, MethodParameter param
9999
boolean isMultipart = (multipartRequest != null || isMultipartContent(request));
100100

101101
if (MultipartFile.class == parameter.getNestedParameterType()) {
102-
if (multipartRequest == null && isMultipart) {
102+
if (!isMultipart) {
103+
return null;
104+
}
105+
if (multipartRequest == null) {
103106
multipartRequest = new StandardMultipartHttpServletRequest(request);
104107
}
105-
return (multipartRequest != null ? multipartRequest.getFile(name) : null);
108+
return multipartRequest.getFile(name);
106109
}
107110
else if (isMultipartFileCollection(parameter)) {
108-
if (multipartRequest == null && isMultipart) {
111+
if (!isMultipart) {
112+
return null;
113+
}
114+
if (multipartRequest == null) {
109115
multipartRequest = new StandardMultipartHttpServletRequest(request);
110116
}
111-
return (multipartRequest != null ? multipartRequest.getFiles(name) : null);
117+
List<MultipartFile> files = multipartRequest.getFiles(name);
118+
return (!files.isEmpty() ? files : null);
112119
}
113120
else if (isMultipartFileArray(parameter)) {
114-
if (multipartRequest == null && isMultipart) {
115-
multipartRequest = new StandardMultipartHttpServletRequest(request);
116-
}
117-
if (multipartRequest != null) {
118-
List<MultipartFile> multipartFiles = multipartRequest.getFiles(name);
119-
return multipartFiles.toArray(new MultipartFile[0]);
120-
}
121-
else {
121+
if (!isMultipart) {
122122
return null;
123123
}
124+
if (multipartRequest == null) {
125+
multipartRequest = new StandardMultipartHttpServletRequest(request);
126+
}
127+
List<MultipartFile> files = multipartRequest.getFiles(name);
128+
return (!files.isEmpty() ? files.toArray(new MultipartFile[0]) : null);
124129
}
125130
else if (Part.class == parameter.getNestedParameterType()) {
126-
return (isMultipart ? request.getPart(name): null);
131+
if (!isMultipart) {
132+
return null;
133+
}
134+
return request.getPart(name);
127135
}
128136
else if (isPartCollection(parameter)) {
129-
return (isMultipart ? resolvePartList(request, name) : null);
137+
if (!isMultipart) {
138+
return null;
139+
}
140+
List<Part> parts = resolvePartList(request, name);
141+
return (!parts.isEmpty() ? parts : null);
130142
}
131143
else if (isPartArray(parameter)) {
132-
return (isMultipart ? resolvePartList(request, name).toArray(new Part[0]) : null);
144+
if (!isMultipart) {
145+
return null;
146+
}
147+
List<Part> parts = resolvePartList(request, name);
148+
return (!parts.isEmpty() ? parts.toArray(new Part[0]) : null);
133149
}
134150
else {
135151
return UNRESOLVABLE;

spring-web/src/test/java/org/springframework/web/method/annotation/RequestParamMethodArgumentResolverTests.java

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2019 the original author or authors.
2+
* Copyright 2002-2020 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -199,6 +199,17 @@ public void resolveMultipartFileList() throws Exception {
199199
assertThat(result).isEqualTo(Arrays.asList(expected1, expected2));
200200
}
201201

202+
@Test
203+
public void resolveMultipartFileListMissing() throws Exception {
204+
MockMultipartHttpServletRequest request = new MockMultipartHttpServletRequest();
205+
request.addFile(new MockMultipartFile("other", "Hello World 3".getBytes()));
206+
webRequest = new ServletWebRequest(request);
207+
208+
MethodParameter param = this.testMethod.annotPresent(RequestParam.class).arg(List.class, MultipartFile.class);
209+
assertThatExceptionOfType(MissingServletRequestPartException.class).isThrownBy(() ->
210+
resolver.resolveArgument(param, null, webRequest, null));
211+
}
212+
202213
@Test
203214
public void resolveMultipartFileArray() throws Exception {
204215
MockMultipartHttpServletRequest request = new MockMultipartHttpServletRequest();
@@ -220,6 +231,17 @@ public void resolveMultipartFileArray() throws Exception {
220231
assertThat(expected2).isEqualTo(parts[1]);
221232
}
222233

234+
@Test
235+
public void resolveMultipartFileArrayMissing() throws Exception {
236+
MockMultipartHttpServletRequest request = new MockMultipartHttpServletRequest();
237+
request.addFile(new MockMultipartFile("other", "Hello World 3".getBytes()));
238+
webRequest = new ServletWebRequest(request);
239+
240+
MethodParameter param = this.testMethod.annotPresent(RequestParam.class).arg(MultipartFile[].class);
241+
assertThatExceptionOfType(MissingServletRequestPartException.class).isThrownBy(() ->
242+
resolver.resolveArgument(param, null, webRequest, null));
243+
}
244+
223245
@Test
224246
public void resolvePart() throws Exception {
225247
MockHttpServletRequest request = new MockHttpServletRequest();
@@ -257,6 +279,19 @@ public void resolvePartList() throws Exception {
257279
assertThat(result).isEqualTo(Arrays.asList(expected1, expected2));
258280
}
259281

282+
@Test
283+
public void resolvePartListMissing() throws Exception {
284+
MockHttpServletRequest request = new MockHttpServletRequest();
285+
request.setMethod("POST");
286+
request.setContentType("multipart/form-data");
287+
request.addPart(new MockPart("other", "Hello World 3".getBytes()));
288+
webRequest = new ServletWebRequest(request);
289+
290+
MethodParameter param = this.testMethod.annotPresent(RequestParam.class).arg(List.class, Part.class);
291+
assertThatExceptionOfType(MissingServletRequestPartException.class).isThrownBy(() ->
292+
resolver.resolveArgument(param, null, webRequest, null));
293+
}
294+
260295
@Test
261296
public void resolvePartArray() throws Exception {
262297
MockHttpServletRequest request = new MockHttpServletRequest();
@@ -280,6 +315,19 @@ public void resolvePartArray() throws Exception {
280315
assertThat(expected2).isEqualTo(parts[1]);
281316
}
282317

318+
@Test
319+
public void resolvePartArrayMissing() throws Exception {
320+
MockHttpServletRequest request = new MockHttpServletRequest();
321+
request.setMethod("POST");
322+
request.setContentType("multipart/form-data");
323+
request.addPart(new MockPart("other", "Hello World 3".getBytes()));
324+
webRequest = new ServletWebRequest(request);
325+
326+
MethodParameter param = this.testMethod.annotPresent(RequestParam.class).arg(Part[].class);
327+
assertThatExceptionOfType(MissingServletRequestPartException.class).isThrownBy(() ->
328+
resolver.resolveArgument(param, null, webRequest, null));
329+
}
330+
283331
@Test
284332
public void resolveMultipartFileNotAnnot() throws Exception {
285333
MockMultipartHttpServletRequest request = new MockMultipartHttpServletRequest();

0 commit comments

Comments
 (0)