Jsf 2.2 即使在InvokeApplication PhaseListener的Before阶段中设置了renderResponse,事件仍然会在myfaces中广播
我们正在WebSphereLiberty概要文件服务器上使用myfaces 我们有一个针对InvokeApplication阶段设置的phaseListener,因此当beforePhase中出现异常时,我们在facesContext上设置renderResponse,认为它将跳过进一步的处理,不会在InvokeApplication上广播事件,但它确实会 LifecycleImpl.java-行#191起-Jsf 2.2 即使在InvokeApplication PhaseListener的Before阶段中设置了renderResponse,事件仍然会在myfaces中广播,jsf-2.2,myfaces,omnifaces,mojarra,Jsf 2.2,Myfaces,Omnifaces,Mojarra,我们正在WebSphereLiberty概要文件服务器上使用myfaces 我们有一个针对InvokeApplication阶段设置的phaseListener,因此当beforePhase中出现异常时,我们在facesContext上设置renderResponse,认为它将跳过进一步的处理,不会在InvokeApplication上广播事件,但它确实会 LifecycleImpl.java-行#191起- if (shouldRenderResponse(context, c
if (shouldRenderResponse(context, currentPhaseId, true))
{
skipFurtherProcessing = true;
}
if (executor.execute(context))
{
return true;
}
现在,上面的代码显然没有跳过executor.execute(上下文),即使在执行renderResponse时也是如此。
但是Mojarra 2.2.11-行为不同-如果在PreforePhase中调用renderResponse,它将跳过。
com.sun.faces.lifecycle.Phase-第99行之后:
Phase.java
handleBeforePhase(context, listeners, event);
if (!shouldSkip(context)) {
execute(context);
}
private boolean shouldSkip(FacesContext context) {
if (context.getResponseComplete()) {
return (true);
} else if (context.getRenderResponse() &&
!PhaseId.RENDER_RESPONSE.equals(this.getId())) {
return (true);
} else {
return (false);
}
}
Phase.java中的“shouldSkip”方法impl
handleBeforePhase(context, listeners, event);
if (!shouldSkip(context)) {
execute(context);
}
private boolean shouldSkip(FacesContext context) {
if (context.getResponseComplete()) {
return (true);
} else if (context.getRenderResponse() &&
!PhaseId.RENDER_RESPONSE.equals(this.getId())) {
return (true);
} else {
return (false);
}
}
现在要么Mojarra错了,要么Myfaces实现错了。在我们的例子(即myfaces实现)中,如果在调用应用程序的before阶段设置了render response,那么跳过事件的机制应该是什么