Spring WebFlow从Event属性获取URL实现外部重定向问题排查
问题根因
- 低级错误:
execute方法返回的Event对象的事件名前多了一个空格,写为了" successRedirect",和flow.xml中transition配置的on="successRedirect"不匹配,会导致上下文传递异常。 - 核心错误:Spring WebFlow的隐含变量
currentEvent仅在触发transition的动作执行上下文范围内有效,当transition完成跳转到新的externalViewview-state后,上一个动作返回的Event已经被销毁,所以访问currentEvent会返回null,触发字段找不到的报错。
修复方案
1. 修正Action代码
调整Event的事件名,同时将动态URL存入作用域中跨状态传递:
public Event execute(RequestContext context, FormContext formContext) { // 将动态生成的重定向URL存入requestScope,requestScope在单次请求的多个状态流转中有效 context.getRequestScope().put("redirectUrl", "https://google.com"); // 去掉事件名前的多余空格,和flow.xml配置保持一致 return new Event(this, "successRedirect"); }
2. 调整flow.xml配置
方案A:保留原有externalView状态
修改externalView的view属性,从requestScope中取URL:
<view-state id="externalView" view="externalRedirect:#{requestScope.redirectUrl}"> </view-state>
方案B:简化配置(推荐)
如果不需要额外处理externalView的其他逻辑,可以直接去掉单独的externalView state,在action-state的transition中直接重定向,减少不必要的状态节点:
<action-state id="retrieveUri"> <evaluate expression="redirectAction.execute(requestContext, formContext)" /> <transition on="successRedirect" to="externalRedirect:#{requestScope.redirectUrl}" /> </action-state>
补充说明
如果你的URL需要在重定向后还能保留或者有其他跨请求需求,可以替换为flashScope或flowScope存储,当前场景用requestScope足够,不会产生冗余数据。
内容的提问来源于stack exchange,提问作者shamik
相关产品推荐
相关产品推荐

