I have found 
                <interceptor-ref name="messages">
                    AUTOMATIC
                </interceptor-ref>
to work great for addActionMessage.  To tell you the truth I haven't tried
it for addActionError or fieldErrors.  You would redirect after an error
that should render input?  Really?



Greg Lindholm wrote:
> 
> Hi All,
> 
> I took a look at using MessageStoreInterceptor  to preserve messages
> across a redirect and didn't like what I saw, it's too hard to configure. 
> So I wrote an Interceptor RedirectMessageInterceptor (included below) that
> will automatically preserve messages across a redirect or redirectAction. 
> 
> The way it works is… it looks at the result type after
> a action has executed and if the result was a redirect
> (ServletRedirectResult) or a redirectAction
> (ServletActionRedirectResult) and there were any errors, messages, or
> fieldErrors they are stored in the session.  Before the next action
> executes it will check if there are any messages stored in the session
> and add them to the next action.
> 
> 
> The one thing you need to be aware of is: The action you are
> redirecting towards will need to configure a result with name=”input”
> as the added messages will trigger the ‘workflow’ interceptor to return
> a result of “input”.
> I've also posted this here: 
> http://glindholm.wordpress.com/2008/07/02/preserving-messages-across-a-redirect-in-struts-2/
> 
> Feel free to use or modify this as you see fit:
> 
> package my.struts.interceptor;
> import java.util.Collection;
> import java.util.Map;
> import javax.servlet.http.HttpServletRequest;
> import javax.servlet.http.HttpSession;
> import org.apache.struts2.StrutsStatics;
> import org.apache.struts2.dispatcher.ServletActionRedirectResult;
> import org.apache.struts2.dispatcher.ServletRedirectResult;
> import com.opensymphony.xwork2.ActionContext;
> import com.opensymphony.xwork2.ActionInvocation;
> import com.opensymphony.xwork2.Result;
> import com.opensymphony.xwork2.ValidationAware;
> import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
> 
> public class RedirectMessageInterceptor extends MethodFilterInterceptor
> {
>     private static final long serialVersionUID  = 
>         -1847557437429753540L;
> 
>     public static String fieldErrorsSessionKey = 
>         "RedirectMessageInterceptor_FieldErrors";
>     public static String actionErrorsSessionKey = 
>         "RedirectMessageInterceptor_ActionErrors";
>     public static String actionMessagesSessionKey = 
>         "RedirectMessageInterceptor_ActionMessages";
> 
>     public String doIntercept(ActionInvocation invocation) throws
> Exception
>     {
>         Object action = invocation.getAction();
>         if (action instanceof ValidationAware)
>         {
>             before(invocation, (ValidationAware) action);
>         }
> 
>         String result = invocation.invoke();
> 
>         if (action instanceof ValidationAware)
>         {
>             after(invocation, (ValidationAware) action);
>         }
>         return result;
>     }
> 
>     /**
>      * Retrieve the errors and messages from the session and add them 
>      * to the action.
>      */
>     @SuppressWarnings("unchecked")
>     protected void before(ActionInvocation invocation,
>                           ValidationAware validationAware) throws
> Exception
>     {
>         Map session = invocation.getInvocationContext().getSession();
> 
>         Collection<String> actionErrors = 
>             (Collection) session.get(actionErrorsSessionKey);
>         Collection<String> actionMessages = 
>             (Collection) session.get(actionMessagesSessionKey);
>         Map<String, String> fieldErrors = 
>             (Map) session.get(fieldErrorsSessionKey);
> 
>         session.remove(actionErrorsSessionKey);
>         session.remove(actionMessagesSessionKey);
>         session.remove(fieldErrorsSessionKey);
> 
>         if (actionErrors != null && actionErrors.size() > 0)
>         {
>             for (String error : actionErrors)
>             {
>                 validationAware.addActionError(error);
>             }
>         }
> 
>         if (actionMessages != null && actionMessages.size() > 0)
>         {
>             for (String message : actionMessages)
>             {
>                 validationAware.addActionMessage(message);
>             }
>         }
> 
>         if (fieldErrors != null && fieldErrors.size() > 0)
>         {
>             for (Map.Entry<String, String> entry : fieldErrors.entrySet())
>             {
>                 validationAware.addFieldError(entry.getKey(), 
>                                               entry.getValue());
>             }
>         }
> 
>     }
> 
>     /**
>     * If the result is a redirect then store error and messages in the
> session.
>     */
>     @SuppressWarnings("unchecked")
>     protected void after(ActionInvocation invocation,
>                          ValidationAware validationAware) throws Exception
>     {
>         Result result = invocation.getResult();
> 
>         if (result instanceof ServletRedirectResult
>             || result instanceof ServletActionRedirectResult)
>         {
>             ActionContext actionContext = 
>                 invocation.getInvocationContext();
>             HttpServletRequest request = 
>                 (HttpServletRequest) actionContext.get(
>                   StrutsStatics.HTTP_REQUEST);
> 
>             /*
>             * If the session doesn't already exist then it's too late to 
>            * create one as the response has already been committed.
>            * 
>            * This is really only to handle the 'unusual' case of a browser 
>            * refresh after the session has expired. In this case the 
>            * messages are lost :(
>            */
>             HttpSession session = request.getSession(false);
>             if (session != null)
>             {
>                 Collection actionErrors = 
>                     validationAware.getActionErrors();
>                 if (actionErrors != null && actionErrors.size() > 0)
>                 {
>                     session.setAttribute(actionErrorsSessionKey, 
>                                          actionErrors);
>                 }
> 
>                 Collection actionMessages = 
>                     validationAware.getActionMessages();
>                 if (actionMessages != null && actionMessages.size() > 0)
>                 {
>                     session.setAttribute(
>                         actionMessagesSessionKey,
>                         actionMessages);
>                 }
> 
>                 Map fieldErrors = validationAware.getFieldErrors();
>                 if (fieldErrors != null && fieldErrors.size() > 0)
>                 {
>                     session.setAttribute(fieldErrorsSessionKey, 
>                                          fieldErrors);
>                 }
>             }
>         }
>     }
> }
> 
> 
> 
> 
> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/-S2--Preserving-messages-across-a-Redirect-in-Struts-2-tp18245061p18298761.html
Sent from the Struts - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to