SPR-8593 Fix issue in ModelAndViewMethodReturnValueHandler with ModelAndView containing a View

master
Rossen Stoyanchev 13 years ago
parent 38f05678c1
commit 1300da06a6
  1. 4
      org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/support/ModelAndViewMethodReturnValueHandler.java
  2. 98
      org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/method/annotation/support/ModelAndViewMethodReturnValueHandlerTests.java
  3. 46
      org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/method/annotation/support/ViewMethodReturnValueHandlerTests.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 {

@ -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;
}
}

@ -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;
}

Loading…
Cancel
Save