From ba946c08dd4a8c010ff82126476a4c8d994ec8a4 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Mon, 6 Sep 2010 22:56:05 +0000 Subject: [PATCH] copy event parameters to render parameters in case of an action exception as well (SPR-7495) --- .../web/portlet/DispatcherPortlet.java | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/DispatcherPortlet.java b/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/DispatcherPortlet.java index 9f8483e9d5..c75b7f6269 100644 --- a/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/DispatcherPortlet.java +++ b/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/DispatcherPortlet.java @@ -38,6 +38,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 org.apache.commons.logging.Log; @@ -648,17 +649,7 @@ public class DispatcherPortlet extends FrameworkPortlet { triggerAfterActionCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex); // Forward the exception to the render phase to be displayed. try { - // Copy all parameters unless overridden in the action handler. - Enumeration paramNames = request.getParameterNames(); - while (paramNames.hasMoreElements()) { - String paramName = paramNames.nextElement(); - String[] paramValues = request.getParameterValues(paramName); - if (paramValues != null && !response.getRenderParameterMap().containsKey(paramName)) { - response.setRenderParameter(paramName, paramValues); - } - } - response.setRenderParameter(ACTION_EXCEPTION_RENDER_PARAMETER, Boolean.TRUE.toString()); - request.getPortletSession().setAttribute(ACTION_EXCEPTION_SESSION_ATTRIBUTE, ex); + exposeActionException(request, response, ex); logger.debug("Caught exception during action phase - forwarding to render phase", ex); } catch (IllegalStateException ex2) { @@ -931,8 +922,7 @@ public class DispatcherPortlet extends FrameworkPortlet { triggerAfterEventCompletion(mappedHandler, interceptorIndex, request, response, ex); // Forward the exception to the render phase to be displayed. try { - response.setRenderParameter(ACTION_EXCEPTION_RENDER_PARAMETER, Boolean.TRUE.toString()); - request.getPortletSession().setAttribute(ACTION_EXCEPTION_SESSION_ATTRIBUTE, ex); + exposeActionException(request, response, ex); logger.debug("Caught exception during event phase - forwarding to render phase", ex); } catch (IllegalStateException ex2) { @@ -1027,6 +1017,26 @@ public class DispatcherPortlet extends FrameworkPortlet { "]: Does your handler implement a supported interface like Controller?"); } + /** + * Expose the given action exception to the given response. + * @param request current portlet request + * @param response current portlet response + * @param ex the action exception (may also come from an event phase) + */ + protected void exposeActionException(PortletRequest request, StateAwareResponse response, Exception ex) { + // Copy all parameters unless overridden in the action handler. + Enumeration paramNames = request.getParameterNames(); + while (paramNames.hasMoreElements()) { + String paramName = paramNames.nextElement(); + String[] paramValues = request.getParameterValues(paramName); + if (paramValues != null && !response.getRenderParameterMap().containsKey(paramName)) { + response.setRenderParameter(paramName, paramValues); + } + } + response.setRenderParameter(ACTION_EXCEPTION_RENDER_PARAMETER, Boolean.TRUE.toString()); + request.getPortletSession().setAttribute(ACTION_EXCEPTION_SESSION_ATTRIBUTE, ex); + } + /** * Render the given ModelAndView. This is the last stage in handling a request.