From 465e84eda44ceff3f4cd7f8a837638b3f96ca944 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Tue, 23 Mar 2010 08:52:59 +0000 Subject: [PATCH] Revert: SPR-6021 - Allow for using MultiValueMap in GET request for mapping multiple request params --- .../ServletAnnotationControllerTests.java | 38 ++++++++++++++++-- .../support/HandlerMethodInvoker.java | 39 ++++++++++++++----- 2 files changed, 64 insertions(+), 13 deletions(-) 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 1d5f4ceb360..38547d30546 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,11 +1352,23 @@ public class ServletAnnotationControllerTests { public void requestHeaderMap() throws Exception { initServlet(RequestHeaderMapController.class); - MockHttpServletRequest request = new MockHttpServletRequest("GET", "/httpHeaders"); + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/map"); 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()); } @@ -2427,9 +2439,21 @@ public class ServletAnnotationControllerTests { @Controller public static class RequestHeaderMapController { - @RequestMapping("/httpHeaders") - public void httpHeaders(HttpHeaders headers, Writer writer) throws IOException { - assertEquals("Invalid Content-Type", new MediaType("text", "html"), headers.getContentType()); + @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 { for (Iterator>> it1 = headers.entrySet().iterator(); it1.hasNext();) { Map.Entry> entry = it1.next(); writer.write(entry.getKey() + "=["); @@ -2447,6 +2471,12 @@ 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 1b1b022eb65..7475d18036a 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,6 +27,7 @@ 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; @@ -259,10 +260,7 @@ public class HandlerMethodInvoker { } else { Class paramType = methodParam.getParameterType(); - if (HttpHeaders.class.isAssignableFrom(paramType)) { - args[i] = resolveHttpHeadersRequest(webRequest); - } - else if (Model.class.isAssignableFrom(paramType) || Map.class.isAssignableFrom(paramType)) { + if (Model.class.isAssignableFrom(paramType) || Map.class.isAssignableFrom(paramType)) { args[i] = implicitModel; } else if (SessionStatus.class.isAssignableFrom(paramType)) { @@ -482,8 +480,8 @@ public class HandlerMethodInvoker { throws Exception { Class paramType = methodParam.getParameterType(); - if (HttpHeaders.class.isAssignableFrom(paramType)) { - return resolveHttpHeadersRequest(webRequest); + if (Map.class.isAssignableFrom(paramType)) { + return resolveRequestHeaderMap((Class) paramType, webRequest); } if (headerName.length() == 0) { headerName = getRequiredParameterName(methodParam); @@ -507,9 +505,32 @@ public class HandlerMethodInvoker { return binder.convertIfNecessary(headerValue, paramType, methodParam); } - private HttpHeaders resolveHttpHeadersRequest(NativeWebRequest webRequest) throws Exception { - HttpInputMessage inputMessage = createHttpInputMessage(webRequest); - return inputMessage.getHeaders(); + 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; + } } /**