ClassCastException when InternalUtils.addActionError() casts ActionMessages for 
the Global.ERROR_KEY attribute to a sub class, ActionErrors
-------------------------------------------------------------------------------------------------------------------------------------------

         Key: BEEHIVE-1059
         URL: http://issues.apache.org/jira/browse/BEEHIVE-1059
     Project: Beehive
        Type: Bug
  Components: NetUI  
    Versions: V1, v.next, 1.0.1    
    Reporter: Carlin Rogers
 Assigned to: Carlin Rogers 
     Fix For: v.next


The implementaion of InternalUtils.addActionError() casts the 
org.apache.struts.action.ActionMessages for the Global.ERROR_KEY attribute to a 
sub class of org.apache.struts.action.ActionErrors. However, in all the other 
code paths where we set the attribute for Global.ERROR_KEY, we use the parent 
class, ActionMessages.

If a user implements @Jpf.ExceptionHandler method in a page flow and then calls 
FlowController.addActionError(), they will experience this ClassCastException. 
When an exception is thrown, the DefaultExceptionsHandler will set the 
attribute for Global.ERROR_KEY with a new instance ActionMessages that includes 
the ActionMessage with the exception message. Then it invokes the exception 
handler declared in the annotations of the page flow. When the 
FlowController.addActionError() is called, the internal code path will call 
InternalUtils.addActionError() and try to cast the ActionMessages to 
ActionErrors, giving a stack trace like this...

03 Feb 2006 14:55:19,987 ERROR DefaultExceptionsHandler []: Unhandled Page Flow 
Exception

Throwable: java.lang.ClassCastException: org.apache.struts.action.ActionMessages

Stack Trace:
java.lang.ClassCastException: org.apache.struts.action.ActionMessages
        at 
org.apache.beehive.netui.pageflow.internal.InternalUtils.addActionError(InternalUtils.java:415)
        at 
org.apache.beehive.netui.pageflow.FlowController.addActionError(FlowController.java:1439)
...

I will add a test to this shortly. To reproduce you really just need an 
implementation of an exception handler that calls addActionError(). Something 
like this...

    @Jpf.ExceptionHandler(
        forwards = {
            @Jpf.Forward(
                name = "handleError",
                path = "index.jsp")
        })
    protected Forward bogusExceptionHandler( Controller.BogusException ex,
                                           String actionName,
                                           String message, Object form ) {
        Object[] args = ex.getMessageArgs();
        addActionError("name", "messageKey_2", args);
        return new Forward( "handleError" );
    }


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to