From 0afe9a20fdb794508459623ca690163c8cc1df28 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 23 Jun 2010 17:24:28 +0000 Subject: [PATCH] Portlet @MVC's implicit render model will be updated at the end of the event phase git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@3445 50f2f4bb-b051-0410-bef5-90022cba6387 --- .../AnnotationMethodHandlerAdapter.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/mvc/annotation/AnnotationMethodHandlerAdapter.java b/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/mvc/annotation/AnnotationMethodHandlerAdapter.java index 3c8bf99227e..46246b5bd2f 100644 --- a/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/mvc/annotation/AnnotationMethodHandlerAdapter.java +++ b/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/mvc/annotation/AnnotationMethodHandlerAdapter.java @@ -48,6 +48,7 @@ import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import javax.portlet.ResourceRequest; import javax.portlet.ResourceResponse; +import javax.portlet.StateAwareResponse; import javax.portlet.UnavailableException; import javax.portlet.WindowState; import javax.servlet.http.Cookie; @@ -346,6 +347,7 @@ public class AnnotationMethodHandlerAdapter extends PortletContentGenerator return invokeHandlerMethod(request, response, handler, implicitModel); } + @SuppressWarnings("unchecked") private ModelAndView invokeHandlerMethod( PortletRequest request, PortletResponse response, Object handler, ExtendedModelMap implicitModel) throws Exception { @@ -362,11 +364,21 @@ public class AnnotationMethodHandlerAdapter extends PortletContentGenerator handler, (mav != null ? mav.getModel() : null), implicitModel, webRequest); // Expose implicit model for subsequent render phase. - if (response instanceof ActionResponse && !implicitModel.isEmpty()) { - ActionResponse actionResponse = (ActionResponse) response; + if (response instanceof StateAwareResponse && !implicitModel.isEmpty()) { + StateAwareResponse stateResponse = (StateAwareResponse) response; + Map modelToStore = implicitModel; try { - actionResponse.setRenderParameter(IMPLICIT_MODEL_RENDER_PARAMETER, Boolean.TRUE.toString()); - request.getPortletSession().setAttribute(IMPLICIT_MODEL_SESSION_ATTRIBUTE, implicitModel); + stateResponse.setRenderParameter(IMPLICIT_MODEL_RENDER_PARAMETER, Boolean.TRUE.toString()); + if (response instanceof EventResponse) { + // Update the existing model, if any, when responding to an event - + // whereas we're replacing the model in case of an action response. + Map existingModel = (Map) request.getPortletSession().getAttribute(IMPLICIT_MODEL_SESSION_ATTRIBUTE); + if (existingModel != null) { + existingModel.putAll(implicitModel); + modelToStore = existingModel; + } + } + request.getPortletSession().setAttribute(IMPLICIT_MODEL_SESSION_ATTRIBUTE, modelToStore); } catch (IllegalStateException ex) { // Probably sendRedirect called... no need to expose model to render phase.