SPR-8483 Add integration test for accessing multipart request parts with @RequestPart

This commit is contained in:
Rossen Stoyanchev
2011-07-21 16:24:33 +00:00
parent 1b26b4744f
commit 3363d05879
10 changed files with 344 additions and 35 deletions

View File

@@ -33,6 +33,7 @@ import org.springframework.util.StringUtils;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.ValueConstants;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.multipart.MultipartFile;
@@ -85,35 +86,38 @@ public class RequestParamMethodArgumentResolver extends AbstractNamedValueMethod
/**
* Supports the following:
* <ul>
* <li>@RequestParam method arguments. This excludes the case where a parameter is of type
* {@link Map} and the annotation does not specify a request parameter name. See
* {@link RequestParamMapMethodArgumentResolver} instead for such parameters.
* <li>Arguments of type {@link MultipartFile} even if not annotated.
* <li>Arguments of type {@code javax.servlet.http.Part} even if not annotated.
* <li>@RequestParam-annotated method arguments.
* This excludes {@link Map} parameters where the annotation does not specify a name value.
* See {@link RequestParamMapMethodArgumentResolver} instead for such parameters.
* <li>Arguments of type {@link MultipartFile} unless annotated with {@link RequestPart}.
* <li>Arguments of type {@code javax.servlet.http.Part} unless annotated with {@link RequestPart}.
* <li>In default resolution mode, simple type arguments even if not with @RequestParam.
* </ul>
*
* <p>In default resolution mode, simple type arguments not annotated with @RequestParam are also supported.
*/
public boolean supportsParameter(MethodParameter parameter) {
Class<?> paramType = parameter.getParameterType();
RequestParam requestParamAnnot = parameter.getParameterAnnotation(RequestParam.class);
if (requestParamAnnot != null) {
if (parameter.hasParameterAnnotation(RequestParam.class)) {
if (Map.class.isAssignableFrom(paramType)) {
return StringUtils.hasText(requestParamAnnot.value());
String paramName = parameter.getParameterAnnotation(RequestParam.class).value();
return StringUtils.hasText(paramName);
}
else {
return true;
}
return true;
}
else if (MultipartFile.class.equals(paramType)) {
return true;
}
else if ("javax.servlet.http.Part".equals(parameter.getParameterType().getName())) {
return true;
}
else if (this.useDefaultResolution) {
return BeanUtils.isSimpleProperty(paramType);
}
else {
return false;
if (parameter.hasParameterAnnotation(RequestPart.class)) {
return false;
}
else if (MultipartFile.class.equals(paramType) || "javax.servlet.http.Part".equals(paramType.getName())) {
return true;
}
else if (this.useDefaultResolution) {
return BeanUtils.isSimpleProperty(paramType);
}
else {
return false;
}
}
}

View File

@@ -41,6 +41,7 @@ import org.springframework.mock.web.MockMultipartHttpServletRequest;
import org.springframework.mock.web.MockPart;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.ServletWebRequest;
import org.springframework.web.multipart.MultipartFile;
@@ -64,6 +65,7 @@ public class RequestParamMethodArgumentResolverTests {
private MethodParameter paramMultipartFileNotAnnot;
private MethodParameter paramMultipartFileList;
private MethodParameter paramServlet30Part;
private MethodParameter paramRequestPartAnnot;
private NativeWebRequest webRequest;
@@ -76,7 +78,7 @@ public class RequestParamMethodArgumentResolverTests {
ParameterNameDiscoverer paramNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();
Method method = getClass().getMethod("params", String.class, String[].class, Map.class, MultipartFile.class,
Map.class, String.class, MultipartFile.class, List.class, Part.class);
Map.class, String.class, MultipartFile.class, List.class, Part.class, MultipartFile.class);
paramNamedDefaultValueString = new MethodParameter(method, 0);
paramNamedStringArray = new MethodParameter(method, 1);
@@ -91,6 +93,7 @@ public class RequestParamMethodArgumentResolverTests {
paramMultipartFileList.initParameterNameDiscovery(paramNameDiscoverer);
paramServlet30Part = new MethodParameter(method, 8);
paramServlet30Part.initParameterNameDiscovery(paramNameDiscoverer);
paramRequestPartAnnot = new MethodParameter(method, 9);
request = new MockHttpServletRequest();
webRequest = new ServletWebRequest(request, new MockHttpServletResponse());
@@ -110,6 +113,7 @@ public class RequestParamMethodArgumentResolverTests {
resolver = new RequestParamMethodArgumentResolver(null, false);
assertFalse(resolver.supportsParameter(paramStringNotAnnot));
assertFalse(resolver.supportsParameter(paramRequestPartAnnot));
}
@Test
@@ -225,7 +229,8 @@ public class RequestParamMethodArgumentResolverTests {
String stringNotAnnot,
MultipartFile multipartFileNotAnnot,
List<MultipartFile> multipartFileList,
Part servlet30Part) {
Part servlet30Part,
@RequestPart MultipartFile requestPartAnnot) {
}
}