@MVC handler methods reliably resolve MultipartRequest arguments with HiddenHttpMethodFilter (SPR-7296)

This commit is contained in:
Juergen Hoeller 2010-06-20 18:45:42 +00:00
parent 5e5a8a09cf
commit 037c277351
3 changed files with 33 additions and 9 deletions

View File

@ -85,6 +85,7 @@ import org.springframework.web.bind.support.WebArgumentResolver;
import org.springframework.web.bind.support.WebBindingInitializer; import org.springframework.web.bind.support.WebBindingInitializer;
import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.RequestScope; import org.springframework.web.context.request.RequestScope;
import org.springframework.web.multipart.MultipartRequest;
import org.springframework.web.portlet.HandlerAdapter; import org.springframework.web.portlet.HandlerAdapter;
import org.springframework.web.portlet.ModelAndView; import org.springframework.web.portlet.ModelAndView;
import org.springframework.web.portlet.bind.MissingPortletRequestParameterException; import org.springframework.web.portlet.bind.MissingPortletRequestParameterException;
@ -582,17 +583,28 @@ public class AnnotationMethodHandlerAdapter extends PortletContentGenerator
} }
@Override @Override
protected Object resolveStandardArgument(Class parameterType, NativeWebRequest webRequest) protected Object resolveStandardArgument(Class<?> parameterType, NativeWebRequest webRequest)
throws Exception { throws Exception {
PortletRequest request = webRequest.getNativeRequest(PortletRequest.class); PortletRequest request = webRequest.getNativeRequest(PortletRequest.class);
PortletResponse response = webRequest.getNativeResponse(PortletResponse.class); PortletResponse response = webRequest.getNativeResponse(PortletResponse.class);
if (PortletRequest.class.isAssignableFrom(parameterType)) { if (PortletRequest.class.isAssignableFrom(parameterType) ||
return request; MultipartRequest.class.isAssignableFrom(parameterType)) {
Object nativeRequest = webRequest.getNativeRequest(parameterType);
if (nativeRequest == null) {
throw new IllegalStateException(
"Current request is not of type [" + parameterType.getName() + "]: " + request);
}
return nativeRequest;
} }
else if (PortletResponse.class.isAssignableFrom(parameterType)) { else if (PortletResponse.class.isAssignableFrom(parameterType)) {
return response; Object nativeResponse = webRequest.getNativeResponse(parameterType);
if (nativeResponse == null) {
throw new IllegalStateException(
"Current response is not of type [" + parameterType.getName() + "]: " + response);
}
return nativeResponse;
} }
else if (PortletSession.class.isAssignableFrom(parameterType)) { else if (PortletSession.class.isAssignableFrom(parameterType)) {
return request.getPortletSession(); return request.getPortletSession();

View File

@ -103,6 +103,7 @@ import org.springframework.web.bind.support.WebBindingInitializer;
import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.RequestScope; import org.springframework.web.context.request.RequestScope;
import org.springframework.web.context.request.ServletWebRequest; import org.springframework.web.context.request.ServletWebRequest;
import org.springframework.web.multipart.MultipartRequest;
import org.springframework.web.servlet.HandlerAdapter; import org.springframework.web.servlet.HandlerAdapter;
import org.springframework.web.servlet.HandlerMapping; import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
@ -770,16 +771,27 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator
} }
@Override @Override
protected Object resolveStandardArgument(Class parameterType, NativeWebRequest webRequest) throws Exception { protected Object resolveStandardArgument(Class<?> parameterType, NativeWebRequest webRequest) throws Exception {
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class); HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
if (ServletRequest.class.isAssignableFrom(parameterType)) { if (ServletRequest.class.isAssignableFrom(parameterType) ||
return request; MultipartRequest.class.isAssignableFrom(parameterType)) {
Object nativeRequest = webRequest.getNativeRequest(parameterType);
if (nativeRequest == null) {
throw new IllegalStateException(
"Current request is not of type [" + parameterType.getName() + "]: " + request);
}
return nativeRequest;
} }
else if (ServletResponse.class.isAssignableFrom(parameterType)) { else if (ServletResponse.class.isAssignableFrom(parameterType)) {
this.responseArgumentUsed = true; this.responseArgumentUsed = true;
return response; Object nativeResponse = webRequest.getNativeResponse(parameterType);
if (nativeResponse == null) {
throw new IllegalStateException(
"Current response is not of type [" + parameterType.getName() + "]: " + response);
}
return nativeResponse;
} }
else if (HttpSession.class.isAssignableFrom(parameterType)) { else if (HttpSession.class.isAssignableFrom(parameterType)) {
return request.getSession(); return request.getSession();

View File

@ -862,7 +862,7 @@ public class HandlerMethodInvoker {
return value; return value;
} }
protected Object resolveStandardArgument(Class parameterType, NativeWebRequest webRequest) throws Exception { protected Object resolveStandardArgument(Class<?> parameterType, NativeWebRequest webRequest) throws Exception {
if (WebRequest.class.isAssignableFrom(parameterType)) { if (WebRequest.class.isAssignableFrom(parameterType)) {
return webRequest; return webRequest;
} }