jsf2 spring webflow transition异常处理在呈现阶段

时间:2015-06-05 09:54:24

标签: spring-mvc jsf-2 spring-webflow spring-webflow-2


我不确定我是否错过了webflow中异常处理概念的一点,或者这是一个错误。
我希望有人可以帮助我理解它,或者我会在webflow / spring mvc中提交一个bug 以下情况。
JSF2(2.1.X),带有webflow 2.4.0和spring face(2.4.0)
在呈现阶段抛出RuntimeException。不好,但可能发生。
异常处理开始,它尝试对错误站点进行新的转换。像预期的那样工作。
ErrorState已解决,它尝试转换到它。到目前为止一切都很好。
现在问题就在这里。过渡永远不会被执行 org.springframework.webflow.engine.ViewState

protected void doEnter(RequestControlContext context) throws FlowExecutionException {
        context.assignFlowExecutionKey();
        ExternalContext externalContext = context.getExternalContext();
        if (externalContext.isResponseComplete()) {
            if (!externalContext.isResponseCompleteFlowExecutionRedirect()) {
                clearFlash(context);
            }
        } else {
            if (shouldRedirect(context)) {
                context.getExternalContext().requestFlowExecutionRedirect();
                if (popup) {
                    context.getExternalContext().requestRedirectInPopup();
                }
            } else {
                View view = viewFactory.getView(context);
                context.setCurrentView(view);
                render(context, view);
            }
        }
    }

只有在响应尚未完成时才会进行转换 对于渲染阶段中的任何异常,这都不会发生,因为在 在finally块中的org.springframework.faces.mvc.JsfView总会有一个responseComplete。

/**
 * Performs the standard duties of the JSF RENDER_RESPONSE phase.
 */
public void render() throws IOException {
    FacesContext facesContext = FlowFacesContext.getCurrentInstance();
    if (facesContext.getResponseComplete()) {
        return;
    }
    facesContext.setViewRoot(this.viewRoot);
    try {
        logger.debug("Asking faces lifecycle to render");
        this.facesLifecycle.render(facesContext);
    } finally {
        logger.debug("View rendering complete");
        facesContext.responseComplete();
    }
}

对我而言,它看起来像一个bug。 webflow异常处理如何处理renderphase中的异常?

在org.springframework.webflow.context.servlet.ServletExternalContext中无法更改responseComplete-Flag 这是一个私人领域,只能通过

将其设置为真
public void recordResponseComplete() {
    responseComplete = true;
}

我在调试器会话中将标志更改为false。
然后一切都按预期工作,用户看到可以看到错误页面。

0 个答案:

没有答案