即使在InvokeApplication PhaseListener的beforePhase中设置了renderResponse之后,事件仍在myfaces

时间:2016-03-21 17:03:51

标签: jsf-2.2 myfaces omnifaces mojarra

我们在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的前一阶段设置了渲染响应,那么跳过事件的机制应该是什么。

0 个答案:

没有答案