[
https://issues.apache.org/jira/browse/MYFACES-3199?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13226234#comment-13226234
]
Leonardo Uribe commented on MYFACES-3199:
-----------------------------------------
Ok, now I get it.
MK>> Problem1 : UIViewRoot._broadcastAll queues APE into ExceptionQueuedEvent
and
MK>> check for "any of the causes of the exception are an APE" is missing in
code
The check is done in the wrappers. See
javax.faces.event.MethodExpressionActionListener,
javax.faces.event.MethodExpressionValueChangeListener. I think an additional
check on UIViewRoot is not necessary.
MK>> ad Problem 2) queuing the source component is required to solve the mail
goal
MK>> of MYFACES-3053: "any time there is an error in *any* part of the
MK>> lifecycle, the user should see not just a cryptic stack trace, but also the
MK>> **component** - including file and line number - that triggered the
problem"
The patch has some side effects. UIViewRoot._process(FacesContext context,
PhaseId phaseId, PhaseProcessor processor) as a try {} catch block for
RuntimeExceptions, to execute afterPhase listeners and then rethrow the
exception. Later, on LifecycleImpl the exception is catched and finally
published as an EventQueuedException.
In few words, the change proposed here is just publish EventQueuedException for
non APE exceptions in UIViewRoot._broadcastAll too, but preserve the effect of
stop broadcasting when a non APE exception is received.
If you provide a patch removing the check for nested APE, and if no objections
I'll review it and commit it.
> Handling AbortProcessingException is unconsistent
> -------------------------------------------------
>
> Key: MYFACES-3199
> URL: https://issues.apache.org/jira/browse/MYFACES-3199
> Project: MyFaces Core
> Issue Type: Sub-task
> Components: General
> Environment: myface core trunk
> Reporter: Martin Kočí
> Assignee: Leonardo Uribe
> Fix For: 2.0.9, 2.1.3
>
> Attachments: UIViewRoot.patch
>
>
> UIViewRoot:
> try {
> source.broadcast(event);
> }
> catch (AbortProcessingException e)
> {
> ExceptionQueuedEventContext exceptionContext
> = new ExceptionQueuedEventContext(context, e, source,
> context.getCurrentPhaseId());
> context.getApplication().publishEvent(context,
> ExceptionQueuedEvent.class, exceptionContext);
>
> // Abortion
> return false;
> }
> Problem 1:
> <h:inputText valueChangeListener="#{bean.processValueChange}">
> MethodExpressionValueChangeListener wraps all exceptions to
> AbortProcessingException and therefore exception is queued
> Problem 2:
> <h:inputText >
> <f:valueChangeListener binding="#{bean}" />
> </h:inputText>
> ValueChangeListenerHandler does not wrap exception to
> AbortProcessingException and therefore exception is not queued in this block
> (but it is queued from phase executor but without component info)
> Problem 3: JSF spec 2.1 :
> "Clarification made: throwing an AbortProcessingException tells an
> implementation that no further broadcast of the
> current event occurs. Does not affect future events."
> But I think that code in UIViewRoot makes opposite: // Abortion return
> false;
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira