diff --git a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java index 38547d30546..1d5f4ceb360 100644 --- a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java +++ b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java @@ -1352,23 +1352,11 @@ public class ServletAnnotationControllerTests { public void requestHeaderMap() throws Exception { initServlet(RequestHeaderMapController.class); - MockHttpServletRequest request = new MockHttpServletRequest("GET", "/map"); + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/httpHeaders"); request.addHeader("Content-Type", "text/html"); request.addHeader("Custom-Header", new String[]{"value21", "value22"}); 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); assertEquals("Content-Type=[text/html],Custom-Header=[value21,value22]", response.getContentAsString()); } @@ -2439,21 +2427,9 @@ public class ServletAnnotationControllerTests { @Controller public static class RequestHeaderMapController { - @RequestMapping("/map") - public void map(@RequestHeader Map headers, Writer writer) throws IOException { - for (Iterator> it = headers.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = it.next(); - writer.write(entry.getKey() + "=" + entry.getValue()); - if (it.hasNext()) { - writer.write(','); - } - - } - } - - @RequestMapping("/multiValueMap") - public void multiValueMap(@RequestHeader MultiValueMap headers, Writer writer) - throws IOException { + @RequestMapping("/httpHeaders") + public void httpHeaders(HttpHeaders headers, Writer writer) throws IOException { + assertEquals("Invalid Content-Type", new MediaType("text", "html"), headers.getContentType()); for (Iterator>> it1 = headers.entrySet().iterator(); it1.hasNext();) { Map.Entry> entry = it1.next(); 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 { diff --git a/org.springframework.web/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodInvoker.java b/org.springframework.web/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodInvoker.java index 7475d18036a..1b1b022eb65 100644 --- a/org.springframework.web/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodInvoker.java +++ b/org.springframework.web/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodInvoker.java @@ -27,7 +27,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -260,7 +259,10 @@ public class HandlerMethodInvoker { } else { 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; } else if (SessionStatus.class.isAssignableFrom(paramType)) { @@ -480,8 +482,8 @@ public class HandlerMethodInvoker { throws Exception { Class paramType = methodParam.getParameterType(); - if (Map.class.isAssignableFrom(paramType)) { - return resolveRequestHeaderMap((Class) paramType, webRequest); + if (HttpHeaders.class.isAssignableFrom(paramType)) { + return resolveHttpHeadersRequest(webRequest); } if (headerName.length() == 0) { headerName = getRequiredParameterName(methodParam); @@ -505,32 +507,9 @@ public class HandlerMethodInvoker { return binder.convertIfNecessary(headerValue, paramType, methodParam); } - private Map resolveRequestHeaderMap(Class mapType, NativeWebRequest webRequest) { - if (MultiValueMap.class.isAssignableFrom(mapType)) { - MultiValueMap result; - if (HttpHeaders.class.isAssignableFrom(mapType)) { - result = new HttpHeaders(); - } - else { - result = new LinkedMultiValueMap(); - } - for (Iterator iterator = webRequest.getHeaderNames(); iterator.hasNext();) { - String headerName = iterator.next(); - for (String headerValue : webRequest.getHeaderValues(headerName)) { - result.add(headerName, headerValue); - } - } - return result; - } - else { - Map result = new LinkedHashMap(); - for (Iterator iterator = webRequest.getHeaderNames(); iterator.hasNext();) { - String headerName = iterator.next(); - String headerValue = webRequest.getHeader(headerName); - result.put(headerName, headerValue); - } - return result; - } + private HttpHeaders resolveHttpHeadersRequest(NativeWebRequest webRequest) throws Exception { + HttpInputMessage inputMessage = createHttpInputMessage(webRequest); + return inputMessage.getHeaders(); } /**