From 582864802e49f0cc47575be00194e4194d7b1dc5 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Mon, 14 Mar 2016 23:00:19 -0400 Subject: [PATCH] Ensure RedirectModel is initialized This commit fixes an old bug in ModelAndViewContainer where getModel returns a new ModelMap instance that isn't saved and re-used. Issue: SPR-14045 --- .../method/support/ModelAndViewContainer.java | 5 ++++- .../support/ModelAndViewContainerTests.java | 13 ++++++++++++- ...odelAndViewMethodReturnValueHandlerTests.java | 16 +++++++++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/method/support/ModelAndViewContainer.java b/spring-web/src/main/java/org/springframework/web/method/support/ModelAndViewContainer.java index 3c56335672..0238e6270e 100644 --- a/spring-web/src/main/java/org/springframework/web/method/support/ModelAndViewContainer.java +++ b/spring-web/src/main/java/org/springframework/web/method/support/ModelAndViewContainer.java @@ -134,7 +134,10 @@ public class ModelAndViewContainer { return this.defaultModel; } else { - return (this.redirectModel != null) ? this.redirectModel : new ModelMap(); + if (this.redirectModel == null) { + this.redirectModel = new ModelMap(); + } + return this.redirectModel; } } diff --git a/spring-web/src/test/java/org/springframework/web/method/support/ModelAndViewContainerTests.java b/spring-web/src/test/java/org/springframework/web/method/support/ModelAndViewContainerTests.java index 114c6712d8..c5f481e0e2 100644 --- a/spring-web/src/test/java/org/springframework/web/method/support/ModelAndViewContainerTests.java +++ b/spring-web/src/test/java/org/springframework/web/method/support/ModelAndViewContainerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2016 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. @@ -76,4 +76,15 @@ public class ModelAndViewContainerTests { assertTrue(this.mavContainer.getModel().isEmpty()); } + @Test // SPR-14045 + public void ignoreDefaultModelAndWithoutRedirectModel() { + this.mavContainer.setIgnoreDefaultModelOnRedirect(true); + this.mavContainer.setRedirectModelScenario(true); + this.mavContainer.addAttribute("name", "value"); + + assertEquals(1, this.mavContainer.getModel().size()); + assertEquals("value", this.mavContainer.getModel().get("name")); + } + + } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ModelAndViewMethodReturnValueHandlerTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ModelAndViewMethodReturnValueHandlerTests.java index 38807604aa..7b245cfaa2 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ModelAndViewMethodReturnValueHandlerTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ModelAndViewMethodReturnValueHandlerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2016 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. @@ -143,6 +143,20 @@ public class ModelAndViewMethodReturnValueHandlerTests { assertNotSame("RedirectAttributes should not be used if controller doesn't redirect", redirectAttributes, model); } + @Test // SPR-14045 + public void handleRedirectWithIgnoreDefaultModel() throws Exception { + mavContainer.setIgnoreDefaultModelOnRedirect(true); + + RedirectView redirectView = new RedirectView(); + ModelAndView mav = new ModelAndView(redirectView, "name", "value"); + handler.handleReturnValue(mav, returnParamModelAndView, mavContainer, webRequest); + + ModelMap model = mavContainer.getModel(); + assertSame(redirectView, mavContainer.getView()); + assertEquals(1, model.size()); + assertEquals("value", model.get("name")); + } + private MethodParameter getReturnValueParam(String methodName) throws Exception { Method method = getClass().getDeclaredMethod(methodName);