我不确定我是否错过了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。
然后一切都按预期工作,用户看到可以看到错误页面。