|
|
|
@ -1,5 +1,5 @@ |
|
|
|
|
/* |
|
|
|
|
* Copyright 2002-2012 the original author or authors. |
|
|
|
|
* Copyright 2002-2014 the original author or authors. |
|
|
|
|
* |
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
@ -47,7 +47,6 @@ import org.springframework.web.servlet.view.RedirectView; |
|
|
|
|
|
|
|
|
|
import static org.junit.Assert.*; |
|
|
|
|
import static org.mockito.Mockito.mock; |
|
|
|
|
import static org.mockito.Mockito.when; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Test fixture with {@link ServletInvocableHandlerMethod}. |
|
|
|
@ -68,48 +67,50 @@ public class ServletInvocableHandlerMethodTests { |
|
|
|
|
|
|
|
|
|
private MockHttpServletResponse response; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Before |
|
|
|
|
public void setUp() throws Exception { |
|
|
|
|
returnValueHandlers = new HandlerMethodReturnValueHandlerComposite(); |
|
|
|
|
argumentResolvers = new HandlerMethodArgumentResolverComposite(); |
|
|
|
|
mavContainer = new ModelAndViewContainer(); |
|
|
|
|
request = new MockHttpServletRequest(); |
|
|
|
|
response = new MockHttpServletResponse(); |
|
|
|
|
webRequest = new ServletWebRequest(request, response); |
|
|
|
|
this.returnValueHandlers = new HandlerMethodReturnValueHandlerComposite(); |
|
|
|
|
this.argumentResolvers = new HandlerMethodArgumentResolverComposite(); |
|
|
|
|
this.mavContainer = new ModelAndViewContainer(); |
|
|
|
|
this.request = new MockHttpServletRequest(); |
|
|
|
|
this.response = new MockHttpServletResponse(); |
|
|
|
|
this.webRequest = new ServletWebRequest(this.request, this.response); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void invokeAndHandle_VoidWithResponseStatus() throws Exception { |
|
|
|
|
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(new Handler(), "responseStatus"); |
|
|
|
|
handlerMethod.invokeAndHandle(webRequest, mavContainer); |
|
|
|
|
handlerMethod.invokeAndHandle(this.webRequest, this.mavContainer); |
|
|
|
|
|
|
|
|
|
assertTrue("Null return value + @ResponseStatus should result in 'request handled'", |
|
|
|
|
mavContainer.isRequestHandled()); |
|
|
|
|
assertEquals(HttpStatus.BAD_REQUEST.value(), response.getStatus()); |
|
|
|
|
this.mavContainer.isRequestHandled()); |
|
|
|
|
assertEquals(HttpStatus.BAD_REQUEST.value(), this.response.getStatus()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void invokeAndHandle_VoidWithHttpServletResponseArgument() throws Exception { |
|
|
|
|
argumentResolvers.addResolver(new ServletResponseMethodArgumentResolver()); |
|
|
|
|
this.argumentResolvers.addResolver(new ServletResponseMethodArgumentResolver()); |
|
|
|
|
|
|
|
|
|
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(new Handler(), "httpServletResponse", HttpServletResponse.class); |
|
|
|
|
handlerMethod.invokeAndHandle(webRequest, mavContainer); |
|
|
|
|
ServletInvocableHandlerMethod handlerMethod = |
|
|
|
|
getHandlerMethod(new Handler(), "httpServletResponse", HttpServletResponse.class); |
|
|
|
|
handlerMethod.invokeAndHandle(this.webRequest, this.mavContainer); |
|
|
|
|
|
|
|
|
|
assertTrue("Null return value + HttpServletResponse arg should result in 'request handled'", |
|
|
|
|
mavContainer.isRequestHandled()); |
|
|
|
|
this.mavContainer.isRequestHandled()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void invokeAndHandle_VoidRequestNotModified() throws Exception { |
|
|
|
|
webRequest.getNativeRequest(MockHttpServletRequest.class).addHeader("If-Modified-Since", 10 * 1000 * 1000); |
|
|
|
|
this.request.addHeader("If-Modified-Since", 10 * 1000 * 1000); |
|
|
|
|
int lastModifiedTimestamp = 1000 * 1000; |
|
|
|
|
webRequest.checkNotModified(lastModifiedTimestamp); |
|
|
|
|
this.webRequest.checkNotModified(lastModifiedTimestamp); |
|
|
|
|
|
|
|
|
|
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(new Handler(), "notModified"); |
|
|
|
|
handlerMethod.invokeAndHandle(webRequest, mavContainer); |
|
|
|
|
handlerMethod.invokeAndHandle(this.webRequest, this.mavContainer); |
|
|
|
|
|
|
|
|
|
assertTrue("Null return value + 'not modified' request should result in 'request handled'", |
|
|
|
|
mavContainer.isRequestHandled()); |
|
|
|
|
this.mavContainer.isRequestHandled()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// SPR-9159
|
|
|
|
@ -117,40 +118,40 @@ public class ServletInvocableHandlerMethodTests { |
|
|
|
|
@Test |
|
|
|
|
public void invokeAndHandle_NotVoidWithResponseStatusAndReason() throws Exception { |
|
|
|
|
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(new Handler(), "responseStatusWithReason"); |
|
|
|
|
handlerMethod.invokeAndHandle(webRequest, mavContainer); |
|
|
|
|
handlerMethod.invokeAndHandle(this.webRequest, this.mavContainer); |
|
|
|
|
|
|
|
|
|
assertTrue("When a phrase is used, the response should not be used any more", mavContainer.isRequestHandled()); |
|
|
|
|
assertEquals(HttpStatus.BAD_REQUEST.value(), response.getStatus()); |
|
|
|
|
assertEquals("400 Bad Request", response.getErrorMessage()); |
|
|
|
|
assertTrue("When a status reason w/ used, the the request is handled", this.mavContainer.isRequestHandled()); |
|
|
|
|
assertEquals(HttpStatus.BAD_REQUEST.value(), this.response.getStatus()); |
|
|
|
|
assertEquals("400 Bad Request", this.response.getErrorMessage()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test(expected=HttpMessageNotWritableException.class) |
|
|
|
|
public void invokeAndHandle_Exception() throws Exception { |
|
|
|
|
returnValueHandlers.addHandler(new ExceptionRaisingReturnValueHandler()); |
|
|
|
|
this.returnValueHandlers.addHandler(new ExceptionRaisingReturnValueHandler()); |
|
|
|
|
|
|
|
|
|
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(new Handler(), "handle"); |
|
|
|
|
handlerMethod.invokeAndHandle(webRequest, mavContainer); |
|
|
|
|
handlerMethod.invokeAndHandle(this.webRequest, this.mavContainer); |
|
|
|
|
fail("Expected exception"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void invokeAndHandle_DynamicReturnValue() throws Exception { |
|
|
|
|
argumentResolvers.addResolver(new RequestParamMethodArgumentResolver(null, false)); |
|
|
|
|
returnValueHandlers.addHandler(new ViewMethodReturnValueHandler()); |
|
|
|
|
returnValueHandlers.addHandler(new ViewNameMethodReturnValueHandler()); |
|
|
|
|
this.argumentResolvers.addResolver(new RequestParamMethodArgumentResolver(null, false)); |
|
|
|
|
this.returnValueHandlers.addHandler(new ViewMethodReturnValueHandler()); |
|
|
|
|
this.returnValueHandlers.addHandler(new ViewNameMethodReturnValueHandler()); |
|
|
|
|
|
|
|
|
|
// Invoke without a request parameter (String return value)
|
|
|
|
|
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(new Handler(), "dynamicReturnValue", String.class); |
|
|
|
|
handlerMethod.invokeAndHandle(webRequest, mavContainer); |
|
|
|
|
handlerMethod.invokeAndHandle(this.webRequest, this.mavContainer); |
|
|
|
|
|
|
|
|
|
assertNotNull(mavContainer.getView()); |
|
|
|
|
assertEquals(RedirectView.class, mavContainer.getView().getClass()); |
|
|
|
|
assertNotNull(this.mavContainer.getView()); |
|
|
|
|
assertEquals(RedirectView.class, this.mavContainer.getView().getClass()); |
|
|
|
|
|
|
|
|
|
// Invoke with a request parameter (RedirectView return value)
|
|
|
|
|
request.setParameter("param", "value"); |
|
|
|
|
handlerMethod.invokeAndHandle(webRequest, mavContainer); |
|
|
|
|
this.request.setParameter("param", "value"); |
|
|
|
|
handlerMethod.invokeAndHandle(this.webRequest, this.mavContainer); |
|
|
|
|
|
|
|
|
|
assertEquals("view", mavContainer.getViewName()); |
|
|
|
|
assertEquals("view", this.mavContainer.getViewName()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@ -166,24 +167,24 @@ public class ServletInvocableHandlerMethodTests { |
|
|
|
|
private void wrapConcurrentResult_ResponseBody(Object handler) throws Exception { |
|
|
|
|
List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>(); |
|
|
|
|
converters.add(new StringHttpMessageConverter()); |
|
|
|
|
returnValueHandlers.addHandler(new RequestResponseBodyMethodProcessor(converters)); |
|
|
|
|
this.returnValueHandlers.addHandler(new RequestResponseBodyMethodProcessor(converters)); |
|
|
|
|
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(handler, "handle"); |
|
|
|
|
handlerMethod = handlerMethod.wrapConcurrentResult("bar"); |
|
|
|
|
handlerMethod.invokeAndHandle(webRequest, mavContainer); |
|
|
|
|
handlerMethod.invokeAndHandle(this.webRequest, this.mavContainer); |
|
|
|
|
|
|
|
|
|
assertEquals("bar", response.getContentAsString()); |
|
|
|
|
assertEquals("bar", this.response.getContentAsString()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void wrapConcurrentResult_ResponseEntity() throws Exception { |
|
|
|
|
List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>(); |
|
|
|
|
converters.add(new StringHttpMessageConverter()); |
|
|
|
|
returnValueHandlers.addHandler(new HttpEntityMethodProcessor(converters)); |
|
|
|
|
this.returnValueHandlers.addHandler(new HttpEntityMethodProcessor(converters)); |
|
|
|
|
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(new ResponseEntityHandler(), "handle"); |
|
|
|
|
handlerMethod = handlerMethod.wrapConcurrentResult(new ResponseEntity<>("bar", HttpStatus.OK)); |
|
|
|
|
handlerMethod.invokeAndHandle(webRequest, mavContainer); |
|
|
|
|
handlerMethod.invokeAndHandle(this.webRequest, this.mavContainer); |
|
|
|
|
|
|
|
|
|
assertEquals("bar", response.getContentAsString()); |
|
|
|
|
assertEquals("bar", this.response.getContentAsString()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// SPR-12287
|
|
|
|
@ -194,13 +195,13 @@ public class ServletInvocableHandlerMethodTests { |
|
|
|
|
converters.add(new StringHttpMessageConverter()); |
|
|
|
|
List<Object> advice = Arrays.asList(mock(ResponseBodyAdvice.class)); |
|
|
|
|
HttpEntityMethodProcessor processor = new HttpEntityMethodProcessor(converters, null, advice); |
|
|
|
|
returnValueHandlers.addHandler(processor); |
|
|
|
|
this.returnValueHandlers.addHandler(processor); |
|
|
|
|
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(new ResponseEntityHandler(), "handle"); |
|
|
|
|
handlerMethod = handlerMethod.wrapConcurrentResult(new ResponseEntity<>(HttpStatus.OK)); |
|
|
|
|
handlerMethod.invokeAndHandle(webRequest, mavContainer); |
|
|
|
|
handlerMethod.invokeAndHandle(this.webRequest, this.mavContainer); |
|
|
|
|
|
|
|
|
|
assertEquals(200, response.getStatus()); |
|
|
|
|
assertEquals("", response.getContentAsString()); |
|
|
|
|
assertEquals(200, this.response.getStatus()); |
|
|
|
|
assertEquals("", this.response.getContentAsString()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@ -209,13 +210,13 @@ public class ServletInvocableHandlerMethodTests { |
|
|
|
|
converters.add(new StringHttpMessageConverter()); |
|
|
|
|
List<Object> advice = Arrays.asList(mock(ResponseBodyAdvice.class)); |
|
|
|
|
HttpEntityMethodProcessor processor = new HttpEntityMethodProcessor(converters, null, advice); |
|
|
|
|
returnValueHandlers.addHandler(processor); |
|
|
|
|
this.returnValueHandlers.addHandler(processor); |
|
|
|
|
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(new ResponseEntityHandler(), "handle"); |
|
|
|
|
handlerMethod = handlerMethod.wrapConcurrentResult(null); |
|
|
|
|
handlerMethod.invokeAndHandle(webRequest, mavContainer); |
|
|
|
|
handlerMethod.invokeAndHandle(this.webRequest, this.mavContainer); |
|
|
|
|
|
|
|
|
|
assertEquals(200, response.getStatus()); |
|
|
|
|
assertEquals("", response.getContentAsString()); |
|
|
|
|
assertEquals(200, this.response.getStatus()); |
|
|
|
|
assertEquals("", this.response.getContentAsString()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private ServletInvocableHandlerMethod getHandlerMethod(Object controller, |
|
|
|
@ -228,6 +229,7 @@ public class ServletInvocableHandlerMethodTests { |
|
|
|
|
return handlerMethod; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings("unused") |
|
|
|
|
private static class Handler { |
|
|
|
|
|
|
|
|
@ -280,7 +282,6 @@ public class ServletInvocableHandlerMethodTests { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static class ExceptionRaisingReturnValueHandler implements HandlerMethodReturnValueHandler { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|