【发布时间】:2014-07-31 08:40:54
【问题描述】:
我最近在使用 Spring Webflow 时遇到了一个奇怪的错误,我似乎无法找到问题所在,而且似乎没有人遇到过这种情况。
当启动我的流程时,我从数据库加载一个对象,然后用户将在流程中修改该对象。
加载对象时,每个属性都正确绑定:在调试 on-entry 函数时,对象已设置所有属性。但在那之后,当视图被渲染后,对象的“id”和“version”字段突然变为空,所以<form:hidden path="id" /> 或<form:hidden path="version" /> 不会显示任何内容。
我不知道从哪里开始,也不想在这里放无用的代码,所以如果您需要我的代码的某些部分,请询问。
附加信息:
我还尝试使用<form:input path="id" /> 强制修改这些字段,并尝试手动将一些值放入其中并提交表单,但没有成功。
重要更新 似乎每个“复杂”对象都会出现此问题,假设 MyForm 中有另一个类,称为 B。如果该 B 仅包含 Integer 和 String 等基本类型,则可以正确存储和检索它们的 id 和版本字段,如果 B 中有其他类型的对象字段(C 类),那么它们的 id 和版本就会消失。
视图感兴趣的流配置的摘录。请注意,除了 id 和 version 字段外,表单中的每个数据都可以正确查看。
流程:
<input name="idObj" />
<decision-state id="createOrEdit">
<if test="idObj== null" then="newObj" else="modObj" />
</decision-state>
...
<action-state id="modObj">
<evaluate expression="Search.findOne(idObj)" result="flowScope.form"/>
<transition to="object" />
</action-state>
<view-state id="object" view="flow.object" model="form">
<on-entry>
<evaluate expression="handler.prepare(flowScope.form)"/>
</on-entry>
<!-- transitions omitted -->
</view-state>
查看:
<form:form modelAttribute="form" cssClass="form form-horizontal">
<form:input path="id" />
<form:input path="version" />
<!-- other fields -->
<input type="hidden" name="_flowExecutionKey" value="${flowExecutionKey}"/>
</form:form>
处理者:
public void prepare(MyForm form) {
int codType = form.getFormType().getId();
FormType type = service.findOne(codType);
form.setFormType(type); // This is here for JPA to save correctly the instance
RequestContext requestContext = RequestContextHolder.getRequestContext();
requestContext.getViewScope().put("typeList", typeService.findAll());
}
【问题讨论】:
-
显示如何在流 xml 中配置视图以及您在视图中使用的 commandName。
-
编辑了消息。请注意,除了 ID 和 VERSION 字段之外,整个表单和流程都运行良好(因为我可以保存新实例)
-
您是否尝试在视图中使用 cout 作为:
,这是查看 value 是否真的与 form 绑定的试金石。跨度> -
是的,我做到了,但什么都没有显示...似乎在处理对象并将其传递给视图之后,值被删除了。我也尝试手动放置一些值,既将字段放置在视图中,也将值设置在控制器中,但结果仍然是一样的:无论如何 value 都是 null
-
那么我怀疑处理程序的准备方法。你也可以发布它的代码吗?
标签: java spring spring-webflow