[ 
https://issues.apache.org/struts/browse/WW-1027?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_41015
 ] 

Adam Crume commented on WW-1027:
--------------------------------

I believe this *is* an issue.  I have an action saveAction which I want to 
chain to editAction whenever there is a validation error.  This is often 
necessary because a JSP will be displayed which has dynamic content such as a 
selectable list of items.  However, if editAction has validation support, it 
will never be executed (even if it would validate successfully).

> ValidationInterceptor and DefaultWorkflowInterceptor Improvements for 
> forwarding to another action when meeting validation error
> --------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: WW-1027
>                 URL: https://issues.apache.org/struts/browse/WW-1027
>             Project: Struts 2
>          Issue Type: Improvement
>    Affects Versions: WW 2.2
>         Environment: jdk: sun jdk 1.4.2 appserver: tomcat 4.1.28 os:windows 
> xp sp2
>            Reporter: jacky hua
>         Assigned To: Rene Gielen
>             Fix For: WW 2.2.1
>
>
> when meeting validation error after submitting a page, the program will go 
> into DefaultWorkflowInterceptor and return fixed result code:"input", the 
> result code is pointed to a jsp or an action according to the defination of 
> xwork.xml, and I think pointing to an action is powerful choice, because it 
> can give a chance to prepare some data for last display page. so this action 
> must escape from validation, since it already has a validation error 
> information. so I suggest to add a specific flag indicating this action can 
> escape from validation. some modified code of DefaultWorkflowInterceptor is 
> like below:
>     public String intercept(ActionInvocation invocation) throws Exception {
>         final ActionContext context = invocation.getInvocationContext();
>         HttpServletRequest request = (HttpServletRequest) 
> context.get(HTTP_REQUEST);
>         Boolean isEscape = 
> (Boolean)request.getAttribute("webwork.validation.escape");
>         if (isEscape != null && isEscape.booleanValue()) {
>             log.debug("Skipping workflow. Validation escape flag found in 
> request.");
>             return invocation.invoke();
>         }
>         
>         if (excludeMethods.contains(invocation.getProxy().getMethod())) {
>             log.debug("Skipping workflow. Method found in exclude list.");
>             return invocation.invoke();
>         }
>         Object action = invocation.getAction();
>         if (action instanceof Validateable) {
>             Validateable validateable = (Validateable) action;
>             validateable.validate();
>         }
>         if (action instanceof ValidationAware) {
>             ValidationAware validationAwareAction = (ValidationAware) action;
>             if (validationAwareAction.hasErrors()) {
>                 request.setAttribute("webwork.validation.escape", new 
> Boolean(true));
>                 return Action.INPUT;
>             }
>         }
>         return invocation.invoke();
>     }
> in addition we need modify ValidationInterceptor similar with above for 
> completelly escaping, code like:
>     protected void before(ActionInvocation invocation) throws Exception {
>         final ActionContext context = invocation.getInvocationContext();
>         HttpServletRequest request = (HttpServletRequest) 
> context.get(HTTP_REQUEST);
>         Boolean isEscape = 
> (Boolean)request.getAttribute("webwork.validation.escape");
>         if (isEscape != null && isEscape.booleanValue()) {
>             log.debug("Skipping workflow. Validation escape flag found in 
> request.");
>             return invocation.invoke();
>         }
>         if (excludeMethods.contains(invocation.getProxy().getMethod())) {
>             log.debug("Skipping validation. Method found in exclude list.");
>             return;
>         }
>         Object action = invocation.getAction();
>         String context = invocation.getProxy().getActionName();
>         if (log.isDebugEnabled()) {
>             log.debug("Validating "
>                     + invocation.getProxy().getNamespace() + "/" + 
> invocation.getProxy().getActionName() + ".");
>         }
>         ActionValidatorManagerFactory.getInstance().validate(action, context);
>     }
> This feature is similar with these two interceptores excludeMethods property, 
> but different action has different exclude methods list, it will result in a 
> messy xwork.xml, so I recommend this solution. any other sugguestion?

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to