SPR-6021 - Allow for using MultiValueMap in GET request for mapping multiple request params
This commit is contained in:
parent
19b4618fb5
commit
c9289a4dcf
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue