diff --git a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java index f1450ed4ab7..cc27df192cf 100644 --- a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java +++ b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java @@ -138,6 +138,7 @@ import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; import org.springframework.web.servlet.mvc.AbstractController; import org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver; import org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.util.NestedServletException; @@ -1910,6 +1911,17 @@ public class ServletAnnotationControllerTests { assertEquals("homeJson", response.getContentAsString()); } + @Test + public void redirectAttribute() throws Exception { + initServlet(RedirectAttributesController.class); + try { + servlet.service(new MockHttpServletRequest("GET", "/"), new MockHttpServletResponse()); + } + catch (NestedServletException ex) { + assertTrue(ex.getMessage().contains("not assignable from the actual model")); + } + } + /* * Controllers @@ -3207,4 +3219,12 @@ public class ServletAnnotationControllerTests { } } + @Controller + static class RedirectAttributesController { + + @RequestMapping(value = "/") + public void handle(RedirectAttributes redirectAttrs) { + } + } + } diff --git a/org.springframework.web/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodInvoker.java b/org.springframework.web/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodInvoker.java index 1ba2620acf6..fb4c82772f8 100644 --- a/org.springframework.web/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodInvoker.java +++ b/org.springframework.web/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodInvoker.java @@ -34,7 +34,6 @@ import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; - import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.BridgeMethodResolver; @@ -313,8 +312,13 @@ public class HandlerMethodInvoker { args[i] = resolveDefaultValue(defaultValue); } else { - Class paramType = methodParam.getParameterType(); + Class paramType = methodParam.getParameterType(); if (Model.class.isAssignableFrom(paramType) || Map.class.isAssignableFrom(paramType)) { + if (!paramType.isAssignableFrom(implicitModel.getClass())) { + throw new IllegalStateException("Argument [" + paramType.getSimpleName() + "] is of type " + + "Model or Map but is not assignable from the actual model. You may need to switch " + + "newer MVC infrastructure classes to use this argument."); + } args[i] = implicitModel; } else if (SessionStatus.class.isAssignableFrom(paramType)) {