@Override public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception { Assert.state(mavContainer != null, "RedirectAttributes argument only supported on regular handler methods"); ModelMap redirectAttributes; if (binderFactory != null) { DataBinder dataBinder = binderFactory.createBinder(webRequest, null, DataBinder.DEFAULT_OBJECT_NAME); redirectAttributes = new RedirectAttributesModelMap(dataBinder); } else { redirectAttributes = new RedirectAttributesModelMap(); } mavContainer.setRedirectModel(redirectAttributes); return redirectAttributes; }
@Test public void redirectScenarioWithRedirectModel() { this.mavContainer.addAttribute("name1", "value1"); this.mavContainer.setRedirectModel(new ModelMap("name2", "value2")); this.mavContainer.setRedirectModelScenario(true); assertEquals(1, this.mavContainer.getModel().size()); assertEquals("value2", this.mavContainer.getModel().get("name2")); }
@Override public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception { Assert.state(mavContainer != null, "RedirectAttributes argument only supported on regular handler methods"); ModelMap redirectAttributes; if (binderFactory != null) { DataBinder dataBinder = binderFactory.createBinder(webRequest, null, DataBinder.DEFAULT_OBJECT_NAME); redirectAttributes = new RedirectAttributesModelMap(dataBinder); } else { redirectAttributes = new RedirectAttributesModelMap(); } mavContainer.setRedirectModel(redirectAttributes); return redirectAttributes; }
@Test // SPR-12542 public void updateModelWhenRedirecting() throws Exception { String attributeName = "sessionAttr"; String attribute = "value"; ModelAndViewContainer container = new ModelAndViewContainer(); container.addAttribute(attributeName, attribute); String queryParam = "123"; String queryParamName = "q"; container.setRedirectModel(new ModelMap(queryParamName, queryParam)); container.setRedirectModelScenario(true); WebDataBinder dataBinder = new WebDataBinder(attribute, attributeName); WebDataBinderFactory binderFactory = mock(WebDataBinderFactory.class); given(binderFactory.createBinder(this.webRequest, attribute, attributeName)).willReturn(dataBinder); ModelFactory modelFactory = new ModelFactory(null, binderFactory, this.attributeHandler); modelFactory.updateModel(this.webRequest, container); assertEquals(queryParam, container.getModel().get(queryParamName)); assertEquals(1, container.getModel().size()); assertEquals(attribute, this.attributeStore.retrieveAttribute(this.webRequest, attributeName)); }
@Test public void handleRedirectAttributesWithViewReference() throws Exception { RedirectAttributesModelMap redirectAttributes = new RedirectAttributesModelMap(); mavContainer.setRedirectModel(redirectAttributes); ModelAndView mav = new ModelAndView(new RedirectView(), "attrName", "attrValue"); handler.handleReturnValue(mav, returnParamModelAndView, mavContainer, webRequest); assertEquals(RedirectView.class, mavContainer.getView().getClass()); assertEquals("attrValue", mavContainer.getModel().get("attrName")); assertSame("RedirectAttributes should be used if controller redirects", redirectAttributes, mavContainer.getModel()); }
@Test public void handleRedirectAttributesWithViewName() throws Exception { RedirectAttributesModelMap redirectAttributes = new RedirectAttributesModelMap(); mavContainer.setRedirectModel(redirectAttributes); ModelAndView mav = new ModelAndView("redirect:viewName", "attrName", "attrValue"); handler.handleReturnValue(mav, returnParamModelAndView, mavContainer, webRequest); ModelMap model = mavContainer.getModel(); assertEquals("redirect:viewName", mavContainer.getViewName()); assertEquals("attrValue", model.get("attrName")); assertSame(redirectAttributes, model); }
@Test public void handleRedirectAttributesWithCustomPrefix() throws Exception { RedirectAttributesModelMap redirectAttributes = new RedirectAttributesModelMap(); mavContainer.setRedirectModel(redirectAttributes); ModelAndView mav = new ModelAndView("myRedirect:viewName", "attrName", "attrValue"); handler.setRedirectPatterns("myRedirect:*"); handler.handleReturnValue(mav, returnParamModelAndView, mavContainer, webRequest); ModelMap model = mavContainer.getModel(); assertEquals("myRedirect:viewName", mavContainer.getViewName()); assertEquals("attrValue", model.get("attrName")); assertSame(redirectAttributes, model); }
@Test public void handleRedirectAttributesWithoutRedirect() throws Exception { RedirectAttributesModelMap redirectAttributes = new RedirectAttributesModelMap(); mavContainer.setRedirectModel(redirectAttributes); ModelAndView mav = new ModelAndView(); handler.handleReturnValue(mav, returnParamModelAndView, mavContainer, webRequest); ModelMap model = mavContainer.getModel(); assertEquals(null, mavContainer.getView()); assertTrue(mavContainer.getModel().isEmpty()); assertNotSame("RedirectAttributes should not be used if controller doesn't redirect", redirectAttributes, model); }
@Test public void returnViewNameRedirect() throws Exception { ModelMap redirectModel = new RedirectAttributesModelMap(); this.mavContainer.setRedirectModel(redirectModel); this.handler.handleReturnValue("redirect:testView", this.param, this.mavContainer, this.webRequest); assertEquals("redirect:testView", this.mavContainer.getViewName()); assertSame(redirectModel, this.mavContainer.getModel()); }
@Test public void returnViewCustomRedirect() throws Exception { ModelMap redirectModel = new RedirectAttributesModelMap(); this.mavContainer.setRedirectModel(redirectModel); this.handler.setRedirectPatterns("myRedirect:*"); this.handler.handleReturnValue("myRedirect:testView", this.param, this.mavContainer, this.webRequest); assertEquals("myRedirect:testView", this.mavContainer.getViewName()); assertSame(redirectModel, this.mavContainer.getModel()); }
@Test public void returnViewRedirectWithCustomRedirectPattern() throws Exception { ModelMap redirectModel = new RedirectAttributesModelMap(); this.mavContainer.setRedirectModel(redirectModel); this.handler.setRedirectPatterns("myRedirect:*"); this.handler.handleReturnValue("redirect:testView", this.param, this.mavContainer, this.webRequest); assertEquals("redirect:testView", this.mavContainer.getViewName()); assertSame(redirectModel, this.mavContainer.getModel()); }
@Test public void returnViewRedirect() throws Exception { RedirectView redirectView = new RedirectView("testView"); ModelMap redirectModel = new RedirectAttributesModelMap(); this.mavContainer.setRedirectModel(redirectModel); MethodParameter param = createReturnValueParam("view"); this.handler.handleReturnValue(redirectView, param, this.mavContainer, this.webRequest); assertSame(redirectView, this.mavContainer.getView()); assertSame("Should have switched to the RedirectModel", redirectModel, this.mavContainer.getModel()); }
@Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { ModelMap redirectAttributes; if(binderFactory != null) { DataBinder dataBinder = binderFactory.createBinder(webRequest, null, null); redirectAttributes = new RedirectAttributesModelMap(dataBinder); } else { redirectAttributes = new RedirectAttributesModelMap(); } mavContainer.setRedirectModel(redirectAttributes); return redirectAttributes; }