Spring Web Flow表单单选按钮提交后仅刷新无响应问题求助
首先,你的流程提交后仅刷新、无后续执行的核心问题出在transition中的表达式错误,还有几处配置冲突/冗余的地方,我帮你逐个梳理:
1. 致命错误:Transition中的evaluate表达式完全错误
看你两个业务transition里的代码:
<evaluate expression="order.setTable(flowScope.order)" />
Order类的setTable方法接收的是Place类型参数,但你这里把flowScope.order(也就是Order对象本身)传进去了,类型完全不匹配!这会导致流程执行时抛出类型转换异常,Spring Web Flow会自动回滚到当前视图状态,所以看起来页面只是刷新,没有推进流程。
修复方式:
完全删除这两行evaluate代码!因为你的表单已经通过<form:radiobutton path="table" value="${place}"/>把选中的Place对象绑定到了order.table属性上,Spring Web Flow在提交表单时会自动完成数据绑定,不需要手动调用setTable。
2. 流程入口的input与视图状态的set冲突
你在流程开头定义了:
<input name="order" required="true" />
这要求启动该流程时必须传入一个order对象,但紧接着在chooseTable视图状态的<on-entry>里又重新创建了一个新的Order对象覆盖它:
<set name="flowScope.order" value="new pizza.Order()"></set>
这会导致两个问题:
- 如果启动流程时没有传入
order,直接触发required="true"的校验错误 - 即使传入了,也会被新创建的对象覆盖,完全失去意义
修复方式:
根据你的业务场景二选一:
- 如果流程启动时不需要外部传入Order,直接删除开头的
<input name="order" required="true" /> - 如果需要外部传入,删除
<on-entry>里的<set>标签,保留传入的Order对象
3. 视图状态的Model配置优化
你的视图状态配置是:
<view-state id="chooseTable" model="flowScope.order">
其实可以简化为:
<view-state id="chooseTable" model="order">
因为Spring Web Flow会默认在flowScope中查找名为order的模型对象,不需要显式写flowScope.。
修复后的完整Flow配置示例
<?xml version="1.0" encoding="UTF-8"?> <flow xmlns="http://www.springframework.org/schema/webflow" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow.xsd"> <!-- 如果不需要外部传入order,就删除这行 --> <!-- <input name="order" required="true" /> --> <view-state id="chooseTable" model="order"> <on-entry> <!-- 如果不需要外部传入order,保留这行创建新对象;否则删除 --> <set name="flowScope.order" value="new pizza.Order()"></set> <evaluate expression="pizzaFlowActions.getFreeTables()" result="viewScope.tables" /> </on-entry> <!-- 移除了错误的evaluate表达式 --> <transition on="chosenCreateOrder" to="bookedToOrder" /> <transition on="chosenNoOrder" to="booked" /> <transition on="cancel" to="cancel" /> </view-state> <end-state id="cancel" /> <end-state id="bookedToOrder" /> <end-state id="booked" /> <global-transitions> <transition on="cancel" to="cancel" /> </global-transitions> </flow>
额外调试建议
如果修复后还是有问题,可以开启Spring Web Flow的调试日志,查看流程执行时的详细错误信息:
在logback.xml或log4j2.xml中添加:
<logger name="org.springframework.webflow" level="DEBUG" />
这样就能在控制台看到流程执行的每一步,包括异常信息,快速定位问题。
内容的提问来源于stack exchange,提问作者Julia Karima

