我最近遇到了一个与Spring Webflow的奇怪错误,我似乎无法找到问题,似乎没有人经历过这个问题。
当我开始流程时,我从数据库加载一个对象,然后用户将在流程中修改该对象。
在加载对象时,每个属性都被正确绑定:在调试入口函数时,该对象具有所有属性集。但是,在那之后,当渲染视图时,对象的“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字段外,每个数据都在表单中正确查看。
FLOW:
<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>
HANDLER:
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());
}
答案 0 :(得分:2)
好的,在桌子上用力撞了三天后,我发现了以下内容:
为了让Webflow能够使用任何类型的自定义表单,它必须实现Serializable
接口,而我的表单对象实际上已经完成了。 但它继承id
和version
字段的对象,因此所有与对象相关的属性都已正确存储,但不是继承的那些没有被序列化的。
因此,简而言之,为了使其工作,我只需将implements Serializable
放在基础数据库对象类中:public class BaseDTO implements Serializable
。