我们在websphere liberty profile server上使用myfaces。
我们有一个针对InvokeApplication阶段设置的phaseListener - 所以当beforePhase中有异常时,我们在facesContext上设置renderResponse,认为它会跳过进一步的处理,并且不会在InvokeApplication上广播事件,但确实如此。
LifecycleImpl.java - 第191行 -
if (shouldRenderResponse(context, currentPhaseId, true))
{
skipFurtherProcessing = true;
}
if (executor.execute(context))
{
return true;
}
现在上面的代码显然没有跳过executor.execute(context),即使执行renderResponse也是如此。 但是Mojarra 2.2.11 - 表现不同 - 如果在beforePhase中调用renderResponse,它将跳过。 com.sun.faces.lifecycle.Phase - 第99行开始:
Phase.java
handleBeforePhase(context, listeners, event);
if (!shouldSkip(context)) {
execute(context);
}
在Phase.java中“shouldSkip”方法impl
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实现),如果在INVOKE APPLICATION的前一阶段设置了渲染响应,那么跳过事件的机制应该是什么。