SPR-6021 - Allow for using MultiValueMap in GET request for mapping multiple request params

This commit is contained in:
Arjen Poutsma 2010-03-22 14:31:27 +00:00
parent 19b4618fb5
commit c9289a4dcf
2 changed files with 13 additions and 64 deletions

View File

@ -1352,23 +1352,11 @@ public class ServletAnnotationControllerTests {
public void requestHeaderMap() throws Exception { public void requestHeaderMap() throws Exception {
initServlet(RequestHeaderMapController.class); initServlet(RequestHeaderMapController.class);
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/map"); MockHttpServletRequest request = new MockHttpServletRequest("GET", "/httpHeaders");
request.addHeader("Content-Type", "text/html"); request.addHeader("Content-Type", "text/html");
request.addHeader("Custom-Header", new String[]{"value21", "value22"}); request.addHeader("Custom-Header", new String[]{"value21", "value22"});
MockHttpServletResponse response = new MockHttpServletResponse(); MockHttpServletResponse response = new MockHttpServletResponse();
servlet.service(request, response);
assertEquals("Content-Type=text/html,Custom-Header=value21", response.getContentAsString());
request.setRequestURI("/multiValueMap");
response = new MockHttpServletResponse();
servlet.service(request, response);
assertEquals("Content-Type=[text/html],Custom-Header=[value21,value22]", response.getContentAsString());
request.setRequestURI("/httpHeaders");
response = new MockHttpServletResponse();
servlet.service(request, response); servlet.service(request, response);
assertEquals("Content-Type=[text/html],Custom-Header=[value21,value22]", response.getContentAsString()); assertEquals("Content-Type=[text/html],Custom-Header=[value21,value22]", response.getContentAsString());
} }
@ -2439,21 +2427,9 @@ public class ServletAnnotationControllerTests {
@Controller @Controller
public static class RequestHeaderMapController { public static class RequestHeaderMapController {
@RequestMapping("/map") @RequestMapping("/httpHeaders")
public void map(@RequestHeader Map<String, String> headers, Writer writer) throws IOException { public void httpHeaders(HttpHeaders headers, Writer writer) throws IOException {
for (Iterator<Map.Entry<String, String>> it = headers.entrySet().iterator(); it.hasNext();) { assertEquals("Invalid Content-Type", new MediaType("text", "html"), headers.getContentType());
Map.Entry<String, String> entry = it.next();
writer.write(entry.getKey() + "=" + entry.getValue());
if (it.hasNext()) {
writer.write(',');
}
}
}
@RequestMapping("/multiValueMap")
public void multiValueMap(@RequestHeader MultiValueMap<String, String> headers, Writer writer)
throws IOException {
for (Iterator<Map.Entry<String, List<String>>> it1 = headers.entrySet().iterator(); it1.hasNext();) { for (Iterator<Map.Entry<String, List<String>>> it1 = headers.entrySet().iterator(); it1.hasNext();) {
Map.Entry<String, List<String>> entry = it1.next(); Map.Entry<String, List<String>> entry = it1.next();
writer.write(entry.getKey() + "=["); writer.write(entry.getKey() + "=[");
@ -2471,12 +2447,6 @@ public class ServletAnnotationControllerTests {
} }
} }
@RequestMapping("/httpHeaders")
public void httpHeaders(@RequestHeader HttpHeaders headers, Writer writer) throws IOException {
assertEquals("Invalid Content-Type", new MediaType("text", "html"), headers.getContentType());
multiValueMap(headers, writer);
}
} }
public interface IMyController { public interface IMyController {

View File

@ -27,7 +27,6 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -260,7 +259,10 @@ public class HandlerMethodInvoker {
} }
else { else {
Class paramType = methodParam.getParameterType(); Class paramType = methodParam.getParameterType();
if (Model.class.isAssignableFrom(paramType) || Map.class.isAssignableFrom(paramType)) { if (HttpHeaders.class.isAssignableFrom(paramType)) {
args[i] = resolveHttpHeadersRequest(webRequest);
}
else if (Model.class.isAssignableFrom(paramType) || Map.class.isAssignableFrom(paramType)) {
args[i] = implicitModel; args[i] = implicitModel;
} }
else if (SessionStatus.class.isAssignableFrom(paramType)) { else if (SessionStatus.class.isAssignableFrom(paramType)) {
@ -480,8 +482,8 @@ public class HandlerMethodInvoker {
throws Exception { throws Exception {
Class<?> paramType = methodParam.getParameterType(); Class<?> paramType = methodParam.getParameterType();
if (Map.class.isAssignableFrom(paramType)) { if (HttpHeaders.class.isAssignableFrom(paramType)) {
return resolveRequestHeaderMap((Class<? extends Map>) paramType, webRequest); return resolveHttpHeadersRequest(webRequest);
} }
if (headerName.length() == 0) { if (headerName.length() == 0) {
headerName = getRequiredParameterName(methodParam); headerName = getRequiredParameterName(methodParam);
@ -505,32 +507,9 @@ public class HandlerMethodInvoker {
return binder.convertIfNecessary(headerValue, paramType, methodParam); return binder.convertIfNecessary(headerValue, paramType, methodParam);
} }
private Map resolveRequestHeaderMap(Class<? extends Map> mapType, NativeWebRequest webRequest) { private HttpHeaders resolveHttpHeadersRequest(NativeWebRequest webRequest) throws Exception {
if (MultiValueMap.class.isAssignableFrom(mapType)) { HttpInputMessage inputMessage = createHttpInputMessage(webRequest);
MultiValueMap<String, String> result; return inputMessage.getHeaders();
if (HttpHeaders.class.isAssignableFrom(mapType)) {
result = new HttpHeaders();
}
else {
result = new LinkedMultiValueMap<String, String>();
}
for (Iterator<String> iterator = webRequest.getHeaderNames(); iterator.hasNext();) {
String headerName = iterator.next();
for (String headerValue : webRequest.getHeaderValues(headerName)) {
result.add(headerName, headerValue);
}
}
return result;
}
else {
Map<String, String> result = new LinkedHashMap<String, String>();
for (Iterator<String> iterator = webRequest.getHeaderNames(); iterator.hasNext();) {
String headerName = iterator.next();
String headerValue = webRequest.getHeader(headerName);
result.put(headerName, headerValue);
}
return result;
}
} }
/** /**