Spring Web Flow如何处理快照未找到等异常并实现重定向?
解决方案:处理Spring Web Flow无效URL引发的未捕获异常
问题根源
<global-transitions>仅能处理流程内部运行时异常,而SnapshotNotFoundException、BadlyFormattedFlowExecutionKeyException这类异常是在流程执行实例初始化阶段(还未进入流程状态机)抛出的,因此无法被流程内的全局转场配置捕获。
可行解决方案
1. 自定义HandlerExceptionResolver(推荐)
实现Spring的HandlerExceptionResolver接口,专门捕获这类流程初始化异常,直接返回错误视图:
public class FlowInitExceptionResolver extends AbstractHandlerExceptionResolver { @Override protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { // 匹配目标异常类型 if (ex instanceof SnapshotNotFoundException || ex instanceof BadlyFormattedFlowExecutionKeyException) { // 跳转到自定义错误页面 return new ModelAndView("error/invalid-flow-url"); } // 其他异常交给后续处理器处理 return null; } }
在Spring配置文件中注册该Bean,并设置优先级确保先执行:
<bean id="flowInitExceptionResolver" class="com.yourpackage.FlowInitExceptionResolver"> <property name="order" value="1"/> <!-- 优先级高于默认异常处理器 --> </bean>
2. 使用@ControllerAdvice全局捕获(适用于Spring MVC环境)
如果项目整合了Spring MVC,用全局异常处理类捕获目标异常:
@ControllerAdvice public class GlobalFlowExceptionHandler { @ExceptionHandler({SnapshotNotFoundException.class, BadlyFormattedFlowExecutionKeyException.class}) public String handleInvalidFlowUrlExceptions() { return "error/invalid-flow-url"; } }
3. 容器级兜底配置(web.xml)
如果上述方案无法覆盖所有场景,可在web.xml中配置容器级错误页面:
<error-page> <exception-type>org.springframework.webflow.execution.repository.snapshot.SnapshotNotFoundException</exception-type> <location>/WEB-INF/views/error/invalid-flow-url.jsp</location> </error-page> <error-page> <exception-type>org.springframework.webflow.execution.repository.BadlyFormattedFlowExecutionKeyException</exception-type> <location>/WEB-INF/views/error/invalid-flow-url.jsp</location> </error-page>
内容的提问来源于stack exchange,提问作者Parameshwar
相关产品推荐
相关产品推荐

