diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/support/ModelAndViewMethodReturnValueHandler.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/support/ModelAndViewMethodReturnValueHandler.java index d99efd844f..84f94f9dd6 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/support/ModelAndViewMethodReturnValueHandler.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/support/ModelAndViewMethodReturnValueHandler.java @@ -42,8 +42,10 @@ public class ModelAndViewMethodReturnValueHandler implements HandlerMethodReturn NativeWebRequest webRequest) throws Exception { if (returnValue != null) { ModelAndView mav = (ModelAndView) returnValue; - mavContainer.setView(mav.getView()); mavContainer.setViewName(mav.getViewName()); + if (!mav.isReference()) { + mavContainer.setView(mav.getView()); + } mavContainer.addAllAttributes(mav.getModel()); } else { diff --git a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/method/annotation/support/ModelAndViewMethodReturnValueHandlerTests.java b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/method/annotation/support/ModelAndViewMethodReturnValueHandlerTests.java new file mode 100644 index 0000000000..cffbc6630f --- /dev/null +++ b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/method/annotation/support/ModelAndViewMethodReturnValueHandlerTests.java @@ -0,0 +1,98 @@ +/* + * 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.assertFalse; +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.web.context.request.ServletWebRequest; +import org.springframework.web.method.support.ModelAndViewContainer; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.view.RedirectView; + +/** + * Test fixture with {@link ModelAndViewMethodReturnValueHandler}. + * + * @author Rossen Stoyanchev + */ +public class ModelAndViewMethodReturnValueHandlerTests { + + private ModelAndViewMethodReturnValueHandler handler; + + private ModelAndViewContainer mavContainer; + + private ServletWebRequest webRequest; + + @Before + public void setUp() { + this.handler = new ModelAndViewMethodReturnValueHandler(); + this.mavContainer = new ModelAndViewContainer(); + this.webRequest = new ServletWebRequest(new MockHttpServletRequest()); + } + + @Test + public void supportsReturnType() throws Exception { + assertTrue(handler.supportsReturnType(getReturnValueParam("modelAndView"))); + assertFalse(handler.supportsReturnType(getReturnValueParam("viewName"))); + } + + @Test + public void handleReturnValueViewName() throws Exception { + ModelAndView mav = new ModelAndView("viewName", "attrName", "attrValue"); + handler.handleReturnValue(mav, getReturnValueParam("modelAndView"), mavContainer, webRequest); + + assertEquals("viewName", mavContainer.getView()); + assertEquals("attrValue", mavContainer.getModel().get("attrName")); + } + + @Test + public void handleReturnValueView() throws Exception { + ModelAndView mav = new ModelAndView(new RedirectView(), "attrName", "attrValue"); + handler.handleReturnValue(mav, getReturnValueParam("modelAndView"), mavContainer, webRequest); + + assertEquals(RedirectView.class, mavContainer.getView().getClass()); + assertEquals("attrValue", mavContainer.getModel().get("attrName")); + } + + @Test + public void handleReturnValueNull() throws Exception { + handler.handleReturnValue(null, getReturnValueParam("modelAndView"), mavContainer, webRequest); + + assertFalse(mavContainer.isResolveView()); + } + + private MethodParameter getReturnValueParam(String methodName) throws Exception { + Method method = getClass().getDeclaredMethod(methodName); + return new MethodParameter(method, -1); + } + + ModelAndView modelAndView() { + return null; + } + + String viewName() { + return null; + } + +} \ No newline at end of file diff --git a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/method/annotation/support/ViewMethodReturnValueHandlerTests.java b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/method/annotation/support/ViewMethodReturnValueHandlerTests.java index 9e5c1e0f33..6cfafd20ce 100644 --- a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/method/annotation/support/ViewMethodReturnValueHandlerTests.java +++ b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/method/annotation/support/ViewMethodReturnValueHandlerTests.java @@ -30,7 +30,6 @@ import org.springframework.ui.ModelMap; import org.springframework.web.context.request.ServletWebRequest; import org.springframework.web.method.support.ModelAndViewContainer; import org.springframework.web.servlet.View; -import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springframework.web.servlet.mvc.support.RedirectAttributesModelMap; import org.springframework.web.servlet.view.InternalResourceView; import org.springframework.web.servlet.view.RedirectView; @@ -50,65 +49,66 @@ public class ViewMethodReturnValueHandlerTests { @Before public void setUp() { - handler = new ViewMethodReturnValueHandler(); - mavContainer = new ModelAndViewContainer(); - webRequest = new ServletWebRequest(new MockHttpServletRequest()); + this.handler = new ViewMethodReturnValueHandler(); + this.mavContainer = new ModelAndViewContainer(); + this.webRequest = new ServletWebRequest(new MockHttpServletRequest()); } @Test public void supportsReturnType() throws Exception { - assertTrue(handler.supportsReturnType(createMethodParam("view"))); - assertTrue(handler.supportsReturnType(createMethodParam("viewName"))); + assertTrue(this.handler.supportsReturnType(createReturnValueParam("view"))); + assertTrue(this.handler.supportsReturnType(createReturnValueParam("viewName"))); } @Test public void returnView() throws Exception { InternalResourceView view = new InternalResourceView("testView"); - handler.handleReturnValue(view, createMethodParam("view"), mavContainer, webRequest); + this.handler.handleReturnValue(view, createReturnValueParam("view"), this.mavContainer, this.webRequest); - assertSame(view, mavContainer.getView()); + assertSame(view, this.mavContainer.getView()); } @Test public void returnViewRedirect() throws Exception { RedirectView redirectView = new RedirectView("testView"); ModelMap redirectModel = new RedirectAttributesModelMap(); - mavContainer.setRedirectModel(redirectModel); - handler.handleReturnValue(redirectView, createMethodParam("view"), mavContainer, webRequest); + this.mavContainer.setRedirectModel(redirectModel); + MethodParameter param = createReturnValueParam("view"); + this.handler.handleReturnValue(redirectView, param, this.mavContainer, this.webRequest); - assertSame(redirectView, mavContainer.getView()); - assertSame("Should have switched to the RedirectModel", redirectModel, mavContainer.getModel()); + assertSame(redirectView, this.mavContainer.getView()); + assertSame("Should have switched to the RedirectModel", redirectModel, this.mavContainer.getModel()); } @Test public void returnViewName() throws Exception { - handler.handleReturnValue("testView", createMethodParam("viewName"), mavContainer, webRequest); + MethodParameter param = createReturnValueParam("viewName"); + this.handler.handleReturnValue("testView", param, this.mavContainer, this.webRequest); - assertEquals("testView", mavContainer.getViewName()); + assertEquals("testView", this.mavContainer.getViewName()); } @Test public void returnViewNameRedirect() throws Exception { ModelMap redirectModel = new RedirectAttributesModelMap(); - mavContainer.setRedirectModel(redirectModel); - handler.handleReturnValue("redirect:testView", createMethodParam("viewName"), mavContainer, webRequest); + this.mavContainer.setRedirectModel(redirectModel); + MethodParameter param = createReturnValueParam("viewName"); + this.handler.handleReturnValue("redirect:testView", param, this.mavContainer, this.webRequest); - assertEquals("redirect:testView", mavContainer.getViewName()); - assertSame("Should have switched to the RedirectModel", redirectModel, mavContainer.getModel()); + assertEquals("redirect:testView", this.mavContainer.getViewName()); + assertSame("Should have switched to the RedirectModel", redirectModel, this.mavContainer.getModel()); } - private MethodParameter createMethodParam(String methodName) throws Exception { + private MethodParameter createReturnValueParam(String methodName) throws Exception { Method method = getClass().getDeclaredMethod(methodName); return new MethodParameter(method, -1); } - @SuppressWarnings("unused") - private View view() { + View view() { return null; } - @SuppressWarnings("unused") - private String viewName() { + String viewName() { return null; }