|
|
@ -19,6 +19,7 @@ package org.springframework.web.servlet.mvc.method.annotation; |
|
|
|
import java.lang.reflect.Method; |
|
|
|
import java.lang.reflect.Method; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.Arrays; |
|
|
|
import java.util.Arrays; |
|
|
|
|
|
|
|
import java.util.Collections; |
|
|
|
import java.util.LinkedHashMap; |
|
|
|
import java.util.LinkedHashMap; |
|
|
|
import java.util.List; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.Map; |
|
|
@ -53,7 +54,8 @@ import org.springframework.web.servlet.DispatcherServlet; |
|
|
|
import org.springframework.web.servlet.FlashMap; |
|
|
|
import org.springframework.web.servlet.FlashMap; |
|
|
|
import org.springframework.web.servlet.ModelAndView; |
|
|
|
import org.springframework.web.servlet.ModelAndView; |
|
|
|
|
|
|
|
|
|
|
|
import static org.junit.Assert.*; |
|
|
|
import static org.junit.Assert.assertEquals; |
|
|
|
|
|
|
|
import static org.junit.Assert.assertTrue; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Unit tests for {@link RequestMappingHandlerAdapter}. |
|
|
|
* Unit tests for {@link RequestMappingHandlerAdapter}. |
|
|
@ -128,7 +130,7 @@ public class RequestMappingHandlerAdapterTests { |
|
|
|
HandlerMethodReturnValueHandler viewHandler = new ViewNameMethodReturnValueHandler(); |
|
|
|
HandlerMethodReturnValueHandler viewHandler = new ViewNameMethodReturnValueHandler(); |
|
|
|
|
|
|
|
|
|
|
|
this.handlerAdapter.setArgumentResolvers(Arrays.asList(redirectAttributesResolver, modelResolver)); |
|
|
|
this.handlerAdapter.setArgumentResolvers(Arrays.asList(redirectAttributesResolver, modelResolver)); |
|
|
|
this.handlerAdapter.setReturnValueHandlers(Arrays.asList(viewHandler)); |
|
|
|
this.handlerAdapter.setReturnValueHandlers(Collections.singletonList(viewHandler)); |
|
|
|
this.handlerAdapter.setIgnoreDefaultModelOnRedirect(true); |
|
|
|
this.handlerAdapter.setIgnoreDefaultModelOnRedirect(true); |
|
|
|
this.handlerAdapter.afterPropertiesSet(); |
|
|
|
this.handlerAdapter.afterPropertiesSet(); |
|
|
|
|
|
|
|
|
|
|
@ -143,7 +145,7 @@ public class RequestMappingHandlerAdapterTests { |
|
|
|
@Test |
|
|
|
@Test |
|
|
|
public void setCustomArgumentResolvers() throws Exception { |
|
|
|
public void setCustomArgumentResolvers() throws Exception { |
|
|
|
HandlerMethodArgumentResolver resolver = new ServletRequestMethodArgumentResolver(); |
|
|
|
HandlerMethodArgumentResolver resolver = new ServletRequestMethodArgumentResolver(); |
|
|
|
this.handlerAdapter.setCustomArgumentResolvers(Arrays.asList(resolver)); |
|
|
|
this.handlerAdapter.setCustomArgumentResolvers(Collections.singletonList(resolver)); |
|
|
|
this.handlerAdapter.afterPropertiesSet(); |
|
|
|
this.handlerAdapter.afterPropertiesSet(); |
|
|
|
|
|
|
|
|
|
|
|
assertTrue(this.handlerAdapter.getArgumentResolvers().contains(resolver)); |
|
|
|
assertTrue(this.handlerAdapter.getArgumentResolvers().contains(resolver)); |
|
|
@ -153,7 +155,7 @@ public class RequestMappingHandlerAdapterTests { |
|
|
|
@Test |
|
|
|
@Test |
|
|
|
public void setArgumentResolvers() throws Exception { |
|
|
|
public void setArgumentResolvers() throws Exception { |
|
|
|
HandlerMethodArgumentResolver resolver = new ServletRequestMethodArgumentResolver(); |
|
|
|
HandlerMethodArgumentResolver resolver = new ServletRequestMethodArgumentResolver(); |
|
|
|
this.handlerAdapter.setArgumentResolvers(Arrays.asList(resolver)); |
|
|
|
this.handlerAdapter.setArgumentResolvers(Collections.singletonList(resolver)); |
|
|
|
this.handlerAdapter.afterPropertiesSet(); |
|
|
|
this.handlerAdapter.afterPropertiesSet(); |
|
|
|
|
|
|
|
|
|
|
|
assertMethodProcessorCount(1, INIT_BINDER_RESOLVER_COUNT, HANDLER_COUNT); |
|
|
|
assertMethodProcessorCount(1, INIT_BINDER_RESOLVER_COUNT, HANDLER_COUNT); |
|
|
@ -162,7 +164,7 @@ public class RequestMappingHandlerAdapterTests { |
|
|
|
@Test |
|
|
|
@Test |
|
|
|
public void setInitBinderArgumentResolvers() throws Exception { |
|
|
|
public void setInitBinderArgumentResolvers() throws Exception { |
|
|
|
HandlerMethodArgumentResolver resolver = new ServletRequestMethodArgumentResolver(); |
|
|
|
HandlerMethodArgumentResolver resolver = new ServletRequestMethodArgumentResolver(); |
|
|
|
this.handlerAdapter.setInitBinderArgumentResolvers(Arrays.<HandlerMethodArgumentResolver>asList(resolver)); |
|
|
|
this.handlerAdapter.setInitBinderArgumentResolvers(Collections.singletonList(resolver)); |
|
|
|
this.handlerAdapter.afterPropertiesSet(); |
|
|
|
this.handlerAdapter.afterPropertiesSet(); |
|
|
|
|
|
|
|
|
|
|
|
assertMethodProcessorCount(RESOLVER_COUNT, 1, HANDLER_COUNT); |
|
|
|
assertMethodProcessorCount(RESOLVER_COUNT, 1, HANDLER_COUNT); |
|
|
@ -171,7 +173,7 @@ public class RequestMappingHandlerAdapterTests { |
|
|
|
@Test |
|
|
|
@Test |
|
|
|
public void setCustomReturnValueHandlers() { |
|
|
|
public void setCustomReturnValueHandlers() { |
|
|
|
HandlerMethodReturnValueHandler handler = new ViewNameMethodReturnValueHandler(); |
|
|
|
HandlerMethodReturnValueHandler handler = new ViewNameMethodReturnValueHandler(); |
|
|
|
this.handlerAdapter.setCustomReturnValueHandlers(Arrays.asList(handler)); |
|
|
|
this.handlerAdapter.setCustomReturnValueHandlers(Collections.singletonList(handler)); |
|
|
|
this.handlerAdapter.afterPropertiesSet(); |
|
|
|
this.handlerAdapter.afterPropertiesSet(); |
|
|
|
|
|
|
|
|
|
|
|
assertTrue(this.handlerAdapter.getReturnValueHandlers().contains(handler)); |
|
|
|
assertTrue(this.handlerAdapter.getReturnValueHandlers().contains(handler)); |
|
|
@ -181,7 +183,7 @@ public class RequestMappingHandlerAdapterTests { |
|
|
|
@Test |
|
|
|
@Test |
|
|
|
public void setReturnValueHandlers() { |
|
|
|
public void setReturnValueHandlers() { |
|
|
|
HandlerMethodReturnValueHandler handler = new ModelMethodProcessor(); |
|
|
|
HandlerMethodReturnValueHandler handler = new ModelMethodProcessor(); |
|
|
|
this.handlerAdapter.setReturnValueHandlers(Arrays.asList(handler)); |
|
|
|
this.handlerAdapter.setReturnValueHandlers(Collections.singletonList(handler)); |
|
|
|
this.handlerAdapter.afterPropertiesSet(); |
|
|
|
this.handlerAdapter.afterPropertiesSet(); |
|
|
|
|
|
|
|
|
|
|
|
assertMethodProcessorCount(RESOLVER_COUNT, INIT_BINDER_RESOLVER_COUNT, 1); |
|
|
|
assertMethodProcessorCount(RESOLVER_COUNT, INIT_BINDER_RESOLVER_COUNT, 1); |
|
|
@ -240,20 +242,37 @@ public class RequestMappingHandlerAdapterTests { |
|
|
|
this.handlerAdapter.setMessageConverters(converters); |
|
|
|
this.handlerAdapter.setMessageConverters(converters); |
|
|
|
|
|
|
|
|
|
|
|
this.webAppContext.registerSingleton("rba", ResponseCodeSuppressingAdvice.class); |
|
|
|
this.webAppContext.registerSingleton("rba", ResponseCodeSuppressingAdvice.class); |
|
|
|
this.webAppContext.registerSingleton("ja", JsonpAdvice.class); |
|
|
|
|
|
|
|
this.webAppContext.refresh(); |
|
|
|
this.webAppContext.refresh(); |
|
|
|
|
|
|
|
|
|
|
|
this.request.addHeader("Accept", MediaType.APPLICATION_JSON_VALUE); |
|
|
|
this.request.addHeader("Accept", MediaType.APPLICATION_JSON_VALUE); |
|
|
|
this.request.setParameter("c", "callback"); |
|
|
|
this.request.setParameter("c", "callback"); |
|
|
|
|
|
|
|
|
|
|
|
HandlerMethod handlerMethod = handlerMethod(new SimpleController(), "handleWithResponseEntity"); |
|
|
|
HandlerMethod handlerMethod = handlerMethod(new SimpleController(), "handleBadRequest"); |
|
|
|
this.handlerAdapter.afterPropertiesSet(); |
|
|
|
this.handlerAdapter.afterPropertiesSet(); |
|
|
|
this.handlerAdapter.handle(this.request, this.response, handlerMethod); |
|
|
|
this.handlerAdapter.handle(this.request, this.response, handlerMethod); |
|
|
|
|
|
|
|
|
|
|
|
assertEquals(200, this.response.getStatus()); |
|
|
|
assertEquals(200, this.response.getStatus()); |
|
|
|
assertEquals("callback({\"status\":400,\"message\":\"body\"});", this.response.getContentAsString()); |
|
|
|
assertEquals("{\"status\":400,\"message\":\"body\"}", this.response.getContentAsString()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
public void jsonpResponseBodyAdvice() throws Exception { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<HttpMessageConverter<?>> converters = new ArrayList<>(); |
|
|
|
|
|
|
|
converters.add(new MappingJackson2HttpMessageConverter()); |
|
|
|
|
|
|
|
this.handlerAdapter.setMessageConverters(converters); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.webAppContext.registerSingleton("jsonpAdvice", JsonpAdvice.class); |
|
|
|
|
|
|
|
this.webAppContext.refresh(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
testJsonp("callback", true); |
|
|
|
|
|
|
|
testJsonp("_callback", true); |
|
|
|
|
|
|
|
testJsonp("_Call.bAcK", true); |
|
|
|
|
|
|
|
testJsonp("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_.", true); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
testJsonp("<script>", false); |
|
|
|
|
|
|
|
testJsonp("!foo!bar", false); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private HandlerMethod handlerMethod(Object handler, String methodName, Class<?>... paramTypes) throws Exception { |
|
|
|
private HandlerMethod handlerMethod(Object handler, String methodName, Class<?>... paramTypes) throws Exception { |
|
|
|
Method method = handler.getClass().getDeclaredMethod(methodName, paramTypes); |
|
|
|
Method method = handler.getClass().getDeclaredMethod(methodName, paramTypes); |
|
|
@ -266,6 +285,26 @@ public class RequestMappingHandlerAdapterTests { |
|
|
|
assertEquals(handlerCount, this.handlerAdapter.getReturnValueHandlers().size()); |
|
|
|
assertEquals(handlerCount, this.handlerAdapter.getReturnValueHandlers().size()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void testJsonp(String value, boolean validValue) throws Exception { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.request = new MockHttpServletRequest("GET", "/"); |
|
|
|
|
|
|
|
this.request.addHeader("Accept", MediaType.APPLICATION_JSON_VALUE); |
|
|
|
|
|
|
|
this.request.setParameter("c", value); |
|
|
|
|
|
|
|
this.response = new MockHttpServletResponse(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HandlerMethod handlerMethod = handlerMethod(new SimpleController(), "handleWithResponseEntity"); |
|
|
|
|
|
|
|
this.handlerAdapter.afterPropertiesSet(); |
|
|
|
|
|
|
|
this.handlerAdapter.handle(this.request, this.response, handlerMethod); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assertEquals(200, this.response.getStatus()); |
|
|
|
|
|
|
|
if (validValue) { |
|
|
|
|
|
|
|
assertEquals("/**/" + value + "({\"foo\":\"bar\"});", this.response.getContentAsString()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
assertEquals("{\"foo\":\"bar\"}", this.response.getContentAsString()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings("unused") |
|
|
|
@SuppressWarnings("unused") |
|
|
|
private static class SimpleController { |
|
|
|
private static class SimpleController { |
|
|
@ -279,9 +318,15 @@ public class RequestMappingHandlerAdapterTests { |
|
|
|
return null; |
|
|
|
return null; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public ResponseEntity<String> handleWithResponseEntity() { |
|
|
|
public ResponseEntity<Map<String, String>> handleWithResponseEntity() { |
|
|
|
|
|
|
|
return new ResponseEntity<Map<String, String>>(Collections.singletonMap( |
|
|
|
|
|
|
|
"foo", "bar"), HttpStatus.OK); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public ResponseEntity<String> handleBadRequest() { |
|
|
|
return new ResponseEntity<String>("body", HttpStatus.BAD_REQUEST); |
|
|
|
return new ResponseEntity<String>("body", HttpStatus.BAD_REQUEST); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -355,12 +400,12 @@ public class RequestMappingHandlerAdapterTests { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ControllerAdvice |
|
|
|
@ControllerAdvice |
|
|
|
private static class JsonpAdvice extends AbstractJsonpResponseBodyAdvice { |
|
|
|
private static class JsonpAdvice extends AbstractJsonpResponseBodyAdvice { |
|
|
|
|
|
|
|
|
|
|
|
public JsonpAdvice() { |
|
|
|
public JsonpAdvice() { |
|
|
|
super("c"); |
|
|
|
super("c"); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|