|
Patrick, Glad to hear that solved the problem. I like your idea for the ParameterMappingInterceptor. Unfortunately, the JSR-168 spec does not give us any way to see what render parameters have already been set -- if any. So during the afterCompletion phase of the Interceptor, there is no way to know if the parameter used for mapping has already been set or not. Let me know if you have any other ideas for how to accomplish this. Thanks! John Patrick Huber wrote: Hi John Thank you for your answer, this helped a lot.When I started using Spring Portlet, I just copied most parts of the xml and didn't think about that interceptor. It was clear to me that it was the equivalent to the param resolver used for multiaction controllers in spring mvc and so I ignored it... Now I just removed the interceptor and the redirect works perfectly. I was also thinking about the interceptor. In certain scenarios it will definitely be very useful, but it shouldn't prevent redirects. So to sum this up: setting render parameters before executing handleAction prevents redirects. Until handleAction has completed, these parameters aren't used anyways, but setting them in afterCompletion may overwrite custom values set by the controller. Here's an idea: - in preHandle, create a copy of the request attributes - then let the controller handle the action - then in afterCompletion, merge the attributes copy into the original request, not overwriting parameters that have been set/changed by the controller. I don't know all the spring portlet internal but from the quick look I've had so far, I think this could work. Thanks again. Patrick 2005/12/8, John Lewis <[EMAIL PROTECTED]>:Patrick, Sorry for the slow response. The sendRedirect issue is a serious pain and does require some careful handling so that it can work. You are correct that the portlet spec makes it illegal to call sendRedirect after certain other methods, like setRenderParameter, have been called. However, it is possible to use sendRedirect with Spring Portlet MVC. In fact the sample code includes an example portlet that will do a redirect to an aribitrary URL. Take a look at it for more details. So, this means that, either in the Spring Portlet code you are using or in your own code, something that breaks sendRedirect is being called before you can issue the redirect. Most likely this means either the Controller or an Interceptor is doing this. First, what specific Controller class does your controller decend from? If it is an AbstractController, then the issue must be elsewhere since AbstractController itself never makes any calls to setRenderParameter (or the other methods that break sendRedirect). If your controller descends from AbstractFormController, SimpleFormController, or AbstractWizardFormController, then you must set the 'redirectAction' property to true on this controller so that setRenderParameter will not be called by the AbstractFormController code. Second, are you using the ParameterMappingInterceptor with this portlet? If so, this will break redirect since the whole point of this Interceptor is to automatically propagate the parameter you are using for your mapping from the action phase to the render phase. If so, remove this Interceptor and propagate the parameter manually in your Controllers when you do need it. Or create a different version of the Interceptor that propagates it during the afterCompletion method instead of the preHandle method -- although this will prevent you from changing the parameter in your Controller, if desired. I hope that helps you find the issue. Let me know how it goes. John Patrick Huber wrote: Hi again I've been investigating a little bit more in the mean time and it's a "bug" in spring portlet. The Portlet Spec, Chapter PLT.12.2.1 (page 50), defines the exact behaviour of sendRedirect (compare with the details in my first mail). Is it possible to work around the problem? If there is a place to post an official issue, I'll happily open an issue there. It's just, the springframework jira doesn't appear to be the right place since spring-portlet is not listed under the springweb module. regards Patrick 2005/12/6, Patrick Huber <[EMAIL PROTECTED]>: Hello John I hope you don't mind if I send you an e-mail directly. I've found this address on a mailing list. I am using spring-portlet and it works quite nice. But now I've come across a problem: I have a small test Portlet which manages a list of bookmarks. I intended to count the number of times someone clicks a link and display the list with a descending click count. So to do this, I added another controller and in the handleActionRequestInternal method, I increase the click count and do a response.sendRedirect. When I call sendRedirect, Pluto complains like this: java.lang.IllegalStateException: Can't invoke sendRedirect() after certain methods have been called at org.apache.pluto.core.impl.ActionResponseImpl.sendRedirect(ActionResponseImpl.java:142) at net.swisstech.portlet.bookmark.web.controller.BookmarkVisitController.handleActionRequestInternal(BookmarkVisitController.java:38) at org.springframework.web.portlet.mvc.AbstractController.handleActionRequest(AbstractController.java:221) at org.springframework.web.portlet.mvc.SimpleControllerHandlerAdapter.handleAction(SimpleControllerHandlerAdapter.java:48) at org.springframework.web.portlet.DispatcherPortlet.doActionDispatch(DispatcherPortlet.java:779) at org.springframework.web.portlet.DispatcherPortlet.doActionService(DispatcherPortlet.java:702) at org.springframework.web.portlet.FrameworkPortlet.processRequest(FrameworkPortlet.java:431) at org.springframework.web.portlet.FrameworkPortlet.processAction(FrameworkPortlet.java:408) at org.apache.pluto.core.PortletServlet.dispatch(PortletServlet.java:171) at org.apache.pluto.core.PortletServlet.doGet(PortletServlet.java:113) So I looked into plutos ActionRespnseImpl. It keeps a flag which is flipped on certain calls like for example setRenderParameter. ParameterMappingInterceptor does call that method in preHandle on line 73. So trying to send a redirect will then throw the above exception. Is it possible to change the spring portlet code so redirecting can work? Or is this a bug in plutos ActionResponseImpl? Could you please comment on this issue? Thank you Patrick -- "I love deadlines. I like the whooshing sound they make as they fly by." -- Douglas Adams -- "I love deadlines. I like the whooshing sound they make as they fly by." -- Douglas Adams-- "I love deadlines. I like the whooshing sound they make as they fly by." -- Douglas Adams |
