SPR-8700 REFINE ORDER OF ARGUMENT RESOLUTION AND RETURN VALUE HANDLING.
1. Consider single-purpose return value types like HttpEntity, Model, View, and ModelAndView ahead of annotations like @ResponseBody and @ModelAttribute. And reversely consider multi-purpose return value types like Map, String, and void only after annotations like @RB and @MA. 2. Order custom argument resolvers and return value handlers after the built-in ones also clarifying the fact they cannot be used to override the built-in ones in Javadoc throughout. 3. Provide hooks in RequestMappingHandlerAdapter that subclasses can use to programmatically modify the list of argument resolvers and return value handlers, also adding new getters so subclasses can get access to what they need for the override. 4. Make SessionStatus available through ModelAndViewContainer and provide an argument resolver for it. 5. Init test and javadoc improvements.
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
package org.springframework.web.servlet.mvc.method.annotation;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertSame;
|
||||
@@ -72,6 +73,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import org.springframework.web.bind.annotation.ResponseStatus;
|
||||
import org.springframework.web.bind.annotation.SessionAttributes;
|
||||
import org.springframework.web.bind.support.ConfigurableWebBindingInitializer;
|
||||
import org.springframework.web.bind.support.SessionStatus;
|
||||
import org.springframework.web.bind.support.WebArgumentResolver;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import org.springframework.web.context.request.RequestContextHolder;
|
||||
@@ -138,7 +140,7 @@ public class RequestMappingHandlerAdapterIntegrationTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void handleMvc() throws Exception {
|
||||
public void handle() throws Exception {
|
||||
|
||||
Class<?>[] parameterTypes = new Class<?>[] { int.class, String.class, String.class, String.class, Map.class,
|
||||
Date.class, Map.class, String.class, String.class, TestBean.class, Errors.class, TestBean.class,
|
||||
@@ -160,15 +162,12 @@ public class RequestMappingHandlerAdapterIntegrationTests {
|
||||
request.setContent("Hello World".getBytes("UTF-8"));
|
||||
request.setUserPrincipal(new User());
|
||||
request.setContextPath("/contextPath");
|
||||
|
||||
System.setProperty("systemHeader", "systemHeaderValue");
|
||||
|
||||
/* Set up path variables as RequestMappingHandlerMapping would... */
|
||||
Map<String, String> uriTemplateVars = new HashMap<String, String>();
|
||||
uriTemplateVars.put("pathvar", "pathvarValue");
|
||||
request.setAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, uriTemplateVars);
|
||||
|
||||
HandlerMethod handlerMethod = handlerMethod("handleMvc", parameterTypes);
|
||||
HandlerMethod handlerMethod = handlerMethod("handle", parameterTypes);
|
||||
ModelAndView mav = handlerAdapter.handle(request, response, handlerMethod);
|
||||
ModelMap model = mav.getModelMap();
|
||||
|
||||
@@ -259,6 +258,14 @@ public class RequestMappingHandlerAdapterIntegrationTests {
|
||||
assertEquals("content", mav.getModelMap().get("requestPart"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void handleAndCompleteSession() throws Exception {
|
||||
HandlerMethod handlerMethod = handlerMethod("handleAndCompleteSession", SessionStatus.class);
|
||||
ModelAndView mav = handlerAdapter.handle(request, response, handlerMethod);
|
||||
|
||||
assertFalse(request.getSession().getAttributeNames().hasMoreElements());
|
||||
}
|
||||
|
||||
private HandlerMethod handlerMethod(String methodName, Class<?>... paramTypes) throws Exception {
|
||||
Method method = handler.getClass().getDeclaredMethod(methodName, paramTypes);
|
||||
return new InvocableHandlerMethod(handler, method);
|
||||
@@ -287,7 +294,7 @@ public class RequestMappingHandlerAdapterIntegrationTests {
|
||||
model.addAttribute(new OtherUser());
|
||||
}
|
||||
|
||||
public String handleMvc(
|
||||
public String handle(
|
||||
@CookieValue("cookie") int cookie,
|
||||
@PathVariable("pathvar") String pathvar,
|
||||
@RequestHeader("header") String header,
|
||||
@@ -336,6 +343,10 @@ public class RequestMappingHandlerAdapterIntegrationTests {
|
||||
public void handleRequestPart(@RequestPart String requestPart, Model model) {
|
||||
model.addAttribute("requestPart", requestPart);
|
||||
}
|
||||
|
||||
public void handleAndCompleteSession(SessionStatus sessionStatus) {
|
||||
sessionStatus.setComplete();
|
||||
}
|
||||
}
|
||||
|
||||
private static class StubValidator implements Validator {
|
||||
|
||||
@@ -20,35 +20,27 @@ import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
import org.springframework.beans.DirectFieldAccessor;
|
||||
import org.springframework.core.MethodParameter;
|
||||
import org.springframework.mock.web.MockHttpServletRequest;
|
||||
import org.springframework.mock.web.MockHttpServletResponse;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.web.bind.annotation.SessionAttributes;
|
||||
import org.springframework.web.bind.support.WebDataBinderFactory;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import org.springframework.web.context.support.GenericWebApplicationContext;
|
||||
import org.springframework.web.method.HandlerMethod;
|
||||
import org.springframework.web.method.annotation.support.ModelMethodProcessor;
|
||||
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
|
||||
import org.springframework.web.method.support.HandlerMethodArgumentResolverComposite;
|
||||
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
|
||||
import org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite;
|
||||
import org.springframework.web.method.support.InvocableHandlerMethod;
|
||||
import org.springframework.web.method.support.ModelAndViewContainer;
|
||||
import org.springframework.web.servlet.FlashMap;
|
||||
import org.springframework.web.servlet.FlashMapManager;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.support.RedirectAttributesMethodArgumentResolver;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.support.ServletRequestMethodArgumentResolver;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.support.ViewMethodReturnValueHandler;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.support.ViewNameMethodReturnValueHandler;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link RequestMappingHandlerAdapter}.
|
||||
@@ -61,12 +53,28 @@ import org.springframework.web.servlet.mvc.method.annotation.support.ViewMethodR
|
||||
*/
|
||||
public class RequestMappingHandlerAdapterTests {
|
||||
|
||||
private static int RESOLVER_COUNT;
|
||||
|
||||
private static int INIT_BINDER_RESOLVER_COUNT;
|
||||
|
||||
private static int HANDLER_COUNT;
|
||||
|
||||
private RequestMappingHandlerAdapter handlerAdapter;
|
||||
|
||||
private MockHttpServletRequest request;
|
||||
|
||||
private MockHttpServletResponse response;
|
||||
|
||||
@BeforeClass
|
||||
public static void setupOnce() {
|
||||
RequestMappingHandlerAdapter adapter = new RequestMappingHandlerAdapter();
|
||||
adapter.afterPropertiesSet();
|
||||
|
||||
RESOLVER_COUNT = adapter.getArgumentResolvers().getResolvers().size();
|
||||
INIT_BINDER_RESOLVER_COUNT = adapter.getInitBinderArgumentResolvers().getResolvers().size();
|
||||
HANDLER_COUNT = adapter.getReturnValueHandlers().getHandlers().size();
|
||||
}
|
||||
|
||||
@Before
|
||||
public void setup() throws Exception {
|
||||
this.handlerAdapter = new RequestMappingHandlerAdapter();
|
||||
@@ -77,17 +85,17 @@ public class RequestMappingHandlerAdapterTests {
|
||||
|
||||
@Test
|
||||
public void cacheControlWithoutSessionAttributes() throws Exception {
|
||||
SimpleHandler handler = new SimpleHandler();
|
||||
HandlerMethod handlerMethod = handlerMethod(new SimpleController(), "handle");
|
||||
handlerAdapter.afterPropertiesSet();
|
||||
handlerAdapter.setCacheSeconds(100);
|
||||
handlerAdapter.handle(request, response, handlerMethod(handler, "handle"));
|
||||
handlerAdapter.handle(request, response, handlerMethod);
|
||||
|
||||
assertTrue(response.getHeader("Cache-Control").toString().contains("max-age"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void cacheControlWithSessionAttributes() throws Exception {
|
||||
SessionAttributeHandler handler = new SessionAttributeHandler();
|
||||
SessionAttributeController handler = new SessionAttributeController();
|
||||
handlerAdapter.afterPropertiesSet();
|
||||
handlerAdapter.setCacheSeconds(100);
|
||||
handlerAdapter.handle(request, response, handlerMethod(handler, "handle"));
|
||||
@@ -99,7 +107,7 @@ public class RequestMappingHandlerAdapterTests {
|
||||
public void setAlwaysUseRedirectAttributes() throws Exception {
|
||||
HandlerMethodArgumentResolver redirectAttributesResolver = new RedirectAttributesMethodArgumentResolver();
|
||||
HandlerMethodArgumentResolver modelResolver = new ModelMethodProcessor();
|
||||
HandlerMethodReturnValueHandler viewHandler = new ViewMethodReturnValueHandler();
|
||||
HandlerMethodReturnValueHandler viewHandler = new ViewNameMethodReturnValueHandler();
|
||||
|
||||
handlerAdapter.setArgumentResolvers(Arrays.asList(redirectAttributesResolver, modelResolver));
|
||||
handlerAdapter.setReturnValueHandlers(Arrays.asList(viewHandler));
|
||||
@@ -108,104 +116,57 @@ public class RequestMappingHandlerAdapterTests {
|
||||
|
||||
request.setAttribute(FlashMapManager.OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
|
||||
|
||||
HandlerMethod handlerMethod = handlerMethod(new RedirectAttributeHandler(), "handle", Model.class);
|
||||
HandlerMethod handlerMethod = handlerMethod(new RedirectAttributeController(), "handle", Model.class);
|
||||
ModelAndView mav = handlerAdapter.handle(request, response, handlerMethod);
|
||||
|
||||
assertTrue("Without RedirectAttributes arg, model should be empty", mav.getModel().isEmpty());
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void setArgumentResolvers() {
|
||||
List<HandlerMethodArgumentResolver> argumentResolvers = new ArrayList<HandlerMethodArgumentResolver>();
|
||||
argumentResolvers.add(new ServletRequestMethodArgumentResolver());
|
||||
|
||||
handlerAdapter.setArgumentResolvers(argumentResolvers);
|
||||
handlerAdapter.afterPropertiesSet();
|
||||
public void setCustomArgumentResolvers() throws Exception {
|
||||
HandlerMethodArgumentResolver resolver = new ServletRequestMethodArgumentResolver();
|
||||
this.handlerAdapter.setCustomArgumentResolvers(Arrays.asList(resolver));
|
||||
this.handlerAdapter.afterPropertiesSet();
|
||||
|
||||
HandlerMethodArgumentResolverComposite composite = (HandlerMethodArgumentResolverComposite)
|
||||
new DirectFieldAccessor(handlerAdapter).getPropertyValue("argumentResolvers");
|
||||
|
||||
List<HandlerMethodArgumentResolver> actual = (List<HandlerMethodArgumentResolver>)
|
||||
new DirectFieldAccessor(composite).getPropertyValue("argumentResolvers");
|
||||
|
||||
assertEquals(argumentResolvers, actual);
|
||||
assertTrue(this.handlerAdapter.getArgumentResolvers().getResolvers().contains(resolver));
|
||||
assertMethodProcessorCount(RESOLVER_COUNT + 1, INIT_BINDER_RESOLVER_COUNT + 1, HANDLER_COUNT);
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void setInitBinderArgumentResolvers() {
|
||||
List<HandlerMethodArgumentResolver> argumentResolvers = new ArrayList<HandlerMethodArgumentResolver>();
|
||||
argumentResolvers.add(new ServletRequestMethodArgumentResolver());
|
||||
|
||||
handlerAdapter.setInitBinderArgumentResolvers(argumentResolvers);
|
||||
handlerAdapter.afterPropertiesSet();
|
||||
|
||||
HandlerMethodArgumentResolverComposite composite = (HandlerMethodArgumentResolverComposite)
|
||||
new DirectFieldAccessor(handlerAdapter).getPropertyValue("initBinderArgumentResolvers");
|
||||
public void setArgumentResolvers() throws Exception {
|
||||
HandlerMethodArgumentResolver resolver = new ServletRequestMethodArgumentResolver();
|
||||
this.handlerAdapter.setArgumentResolvers(Arrays.asList(resolver));
|
||||
this.handlerAdapter.afterPropertiesSet();
|
||||
|
||||
List<HandlerMethodArgumentResolver> actual = (List<HandlerMethodArgumentResolver>)
|
||||
new DirectFieldAccessor(composite).getPropertyValue("argumentResolvers");
|
||||
|
||||
assertEquals(argumentResolvers, actual);
|
||||
assertMethodProcessorCount(1, INIT_BINDER_RESOLVER_COUNT, HANDLER_COUNT);
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void setInitBinderArgumentResolvers() throws Exception {
|
||||
HandlerMethodArgumentResolver resolver = new ServletRequestMethodArgumentResolver();
|
||||
handlerAdapter.setInitBinderArgumentResolvers(Arrays.<HandlerMethodArgumentResolver>asList(resolver));
|
||||
handlerAdapter.afterPropertiesSet();
|
||||
|
||||
assertMethodProcessorCount(RESOLVER_COUNT, 1, HANDLER_COUNT);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setCustomReturnValueHandlers() {
|
||||
HandlerMethodReturnValueHandler handler = new ViewNameMethodReturnValueHandler();
|
||||
handlerAdapter.setCustomReturnValueHandlers(Arrays.asList(handler));
|
||||
handlerAdapter.afterPropertiesSet();
|
||||
|
||||
assertTrue(this.handlerAdapter.getReturnValueHandlers().getHandlers().contains(handler));
|
||||
assertMethodProcessorCount(RESOLVER_COUNT, INIT_BINDER_RESOLVER_COUNT, HANDLER_COUNT + 1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setReturnValueHandlers() {
|
||||
HandlerMethodReturnValueHandler handler = new ModelMethodProcessor();
|
||||
List<HandlerMethodReturnValueHandler> handlers = Arrays.asList(handler);
|
||||
|
||||
handlerAdapter.setReturnValueHandlers(handlers);
|
||||
handlerAdapter.setReturnValueHandlers(Arrays.asList(handler));
|
||||
handlerAdapter.afterPropertiesSet();
|
||||
|
||||
HandlerMethodReturnValueHandlerComposite composite = (HandlerMethodReturnValueHandlerComposite)
|
||||
new DirectFieldAccessor(handlerAdapter).getPropertyValue("returnValueHandlers");
|
||||
|
||||
List<HandlerMethodReturnValueHandler> actual = (List<HandlerMethodReturnValueHandler>)
|
||||
new DirectFieldAccessor(composite).getPropertyValue("returnValueHandlers");
|
||||
|
||||
assertEquals(handlers, actual);
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void setCustomArgumentResolvers() {
|
||||
HandlerMethodArgumentResolver resolver = new TestHanderMethodArgumentResolver();
|
||||
handlerAdapter.setCustomArgumentResolvers(Arrays.asList(resolver));
|
||||
handlerAdapter.afterPropertiesSet();
|
||||
|
||||
HandlerMethodArgumentResolverComposite composite = (HandlerMethodArgumentResolverComposite)
|
||||
new DirectFieldAccessor(handlerAdapter).getPropertyValue("argumentResolvers");
|
||||
|
||||
List<HandlerMethodArgumentResolver> actual = (List<HandlerMethodArgumentResolver>)
|
||||
new DirectFieldAccessor(composite).getPropertyValue("argumentResolvers");
|
||||
|
||||
assertTrue(actual.contains(resolver));
|
||||
|
||||
composite = (HandlerMethodArgumentResolverComposite)
|
||||
new DirectFieldAccessor(handlerAdapter).getPropertyValue("initBinderArgumentResolvers");
|
||||
|
||||
actual = (List<HandlerMethodArgumentResolver>)
|
||||
new DirectFieldAccessor(composite).getPropertyValue("argumentResolvers");
|
||||
|
||||
assertTrue(actual.contains(resolver));
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void setCustomReturnValueHandlers() {
|
||||
TestHandlerMethodReturnValueHandler handler = new TestHandlerMethodReturnValueHandler();
|
||||
handlerAdapter.setCustomReturnValueHandlers(Arrays.<HandlerMethodReturnValueHandler>asList(handler));
|
||||
handlerAdapter.afterPropertiesSet();
|
||||
|
||||
HandlerMethodReturnValueHandlerComposite composite = (HandlerMethodReturnValueHandlerComposite)
|
||||
new DirectFieldAccessor(handlerAdapter).getPropertyValue("returnValueHandlers");
|
||||
|
||||
List<HandlerMethodReturnValueHandler> actual = (List<HandlerMethodReturnValueHandler>)
|
||||
new DirectFieldAccessor(composite).getPropertyValue("returnValueHandlers");
|
||||
|
||||
assertTrue(actual.contains(handler));
|
||||
assertMethodProcessorCount(RESOLVER_COUNT, INIT_BINDER_RESOLVER_COUNT, 1);
|
||||
}
|
||||
|
||||
private HandlerMethod handlerMethod(Object handler, String methodName, Class<?>... paramTypes) throws Exception {
|
||||
@@ -213,46 +174,37 @@ public class RequestMappingHandlerAdapterTests {
|
||||
return new InvocableHandlerMethod(handler, method);
|
||||
}
|
||||
|
||||
private final class TestHanderMethodArgumentResolver implements HandlerMethodArgumentResolver {
|
||||
|
||||
|
||||
public boolean supportsParameter(MethodParameter parameter) {
|
||||
return false;
|
||||
}
|
||||
private void assertMethodProcessorCount(int resolverCount, int initBinderResolverCount, int handlerCount) {
|
||||
assertEquals(resolverCount, this.handlerAdapter.getArgumentResolvers().getResolvers().size());
|
||||
assertEquals(initBinderResolverCount, this.handlerAdapter.getInitBinderArgumentResolvers().getResolvers().size());
|
||||
assertEquals(handlerCount, this.handlerAdapter.getReturnValueHandlers().getHandlers().size());
|
||||
}
|
||||
|
||||
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
|
||||
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
|
||||
@SuppressWarnings("unused")
|
||||
private static class SimpleController {
|
||||
|
||||
public String handle() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private final class TestHandlerMethodReturnValueHandler implements HandlerMethodReturnValueHandler{
|
||||
|
||||
public boolean supportsReturnType(MethodParameter returnType) {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void handleReturnValue(Object returnValue, MethodParameter returnType,
|
||||
ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
|
||||
}
|
||||
}
|
||||
|
||||
static class SimpleHandler {
|
||||
public void handle() {
|
||||
}
|
||||
}
|
||||
|
||||
@SessionAttributes("attr1")
|
||||
static class SessionAttributeHandler {
|
||||
private static class SessionAttributeController {
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public void handle() {
|
||||
}
|
||||
}
|
||||
|
||||
static class RedirectAttributeHandler {
|
||||
@SuppressWarnings("unused")
|
||||
private static class RedirectAttributeController {
|
||||
|
||||
public String handle(Model model) {
|
||||
model.addAttribute("someAttr", "someAttrValue");
|
||||
return "redirect:/path";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -16,7 +16,6 @@
|
||||
|
||||
package org.springframework.web.servlet.mvc.method.annotation.support;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertSame;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
@@ -35,7 +34,7 @@ import org.springframework.web.servlet.view.InternalResourceView;
|
||||
import org.springframework.web.servlet.view.RedirectView;
|
||||
|
||||
/**
|
||||
* Test fixture with {@link DefaultMethodReturnValueHandler}.
|
||||
* Test fixture with {@link ViewMethodReturnValueHandler}.
|
||||
*
|
||||
* @author Rossen Stoyanchev
|
||||
*/
|
||||
@@ -57,7 +56,6 @@ public class ViewMethodReturnValueHandlerTests {
|
||||
@Test
|
||||
public void supportsReturnType() throws Exception {
|
||||
assertTrue(this.handler.supportsReturnType(createReturnValueParam("view")));
|
||||
assertTrue(this.handler.supportsReturnType(createReturnValueParam("viewName")));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -79,25 +77,6 @@ public class ViewMethodReturnValueHandlerTests {
|
||||
assertSame(redirectView, this.mavContainer.getView());
|
||||
assertSame("Should have switched to the RedirectModel", redirectModel, this.mavContainer.getModel());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void returnViewName() throws Exception {
|
||||
MethodParameter param = createReturnValueParam("viewName");
|
||||
this.handler.handleReturnValue("testView", param, this.mavContainer, this.webRequest);
|
||||
|
||||
assertEquals("testView", this.mavContainer.getViewName());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void returnViewNameRedirect() throws Exception {
|
||||
ModelMap redirectModel = new RedirectAttributesModelMap();
|
||||
this.mavContainer.setRedirectModel(redirectModel);
|
||||
MethodParameter param = createReturnValueParam("viewName");
|
||||
this.handler.handleReturnValue("redirect:testView", param, this.mavContainer, this.webRequest);
|
||||
|
||||
assertEquals("redirect:testView", this.mavContainer.getViewName());
|
||||
assertSame("Should have switched to the RedirectModel", redirectModel, this.mavContainer.getModel());
|
||||
}
|
||||
|
||||
private MethodParameter createReturnValueParam(String methodName) throws Exception {
|
||||
Method method = getClass().getDeclaredMethod(methodName);
|
||||
@@ -108,8 +87,4 @@ public class ViewMethodReturnValueHandlerTests {
|
||||
return null;
|
||||
}
|
||||
|
||||
String viewName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* Copyright 2002-2011 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.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.web.servlet.mvc.method.annotation.support;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertSame;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.springframework.core.MethodParameter;
|
||||
import org.springframework.mock.web.MockHttpServletRequest;
|
||||
import org.springframework.ui.ModelMap;
|
||||
import org.springframework.web.context.request.ServletWebRequest;
|
||||
import org.springframework.web.method.support.ModelAndViewContainer;
|
||||
import org.springframework.web.servlet.mvc.support.RedirectAttributesModelMap;
|
||||
|
||||
/**
|
||||
* Test fixture with {@link ViewNameMethodReturnValueHandler}.
|
||||
*
|
||||
* @author Rossen Stoyanchev
|
||||
*/
|
||||
public class ViewNameMethodReturnValueHandlerTests {
|
||||
|
||||
private ViewNameMethodReturnValueHandler handler;
|
||||
|
||||
private ModelAndViewContainer mavContainer;
|
||||
|
||||
private ServletWebRequest webRequest;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
this.handler = new ViewNameMethodReturnValueHandler();
|
||||
this.mavContainer = new ModelAndViewContainer();
|
||||
this.webRequest = new ServletWebRequest(new MockHttpServletRequest());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void supportsReturnType() throws Exception {
|
||||
assertTrue(this.handler.supportsReturnType(createReturnValueParam("viewName")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void returnViewName() throws Exception {
|
||||
MethodParameter param = createReturnValueParam("viewName");
|
||||
this.handler.handleReturnValue("testView", param, this.mavContainer, this.webRequest);
|
||||
|
||||
assertEquals("testView", this.mavContainer.getViewName());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void returnViewNameRedirect() throws Exception {
|
||||
ModelMap redirectModel = new RedirectAttributesModelMap();
|
||||
this.mavContainer.setRedirectModel(redirectModel);
|
||||
MethodParameter param = createReturnValueParam("viewName");
|
||||
this.handler.handleReturnValue("redirect:testView", param, this.mavContainer, this.webRequest);
|
||||
|
||||
assertEquals("redirect:testView", this.mavContainer.getViewName());
|
||||
assertSame("Should have switched to the RedirectModel", redirectModel, this.mavContainer.getModel());
|
||||
}
|
||||
|
||||
private MethodParameter createReturnValueParam(String methodName) throws Exception {
|
||||
Method method = getClass().getDeclaredMethod(methodName);
|
||||
return new MethodParameter(method, -1);
|
||||
}
|
||||
|
||||
String viewName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user