我遇到了转换器和绑定的问题。 我有一个带有表单的页面:选择我用itemValue
绑定对象列表的位置<form:select id="id_a" items="${items}" path="builder" itemValue="id" />
我创建了2个转换器来转换这个bean。一个从bean转换为显示描述的字符串,另一个从id转换为从DB获取bean。
private Converter<BuilderType, String> getBuilderTypeToStringConverter(){
return new Converter<BuilderType, String>(){
public String convert(BuilderType builder){
return builder.getDescription();
}
};
}
private Converter<String,BuilderType> getStringToBuilderTypeConverter(){
return new Converter<String, BuilderType>(){
public BuilderType convert(String id){
return builderService.findById(new Long(id));
}
};
}
因此,当我创建bean时,一切正常,我在select字段中看到了描述,当提交表单时,id转换为真正的bean并在到达控制器之前放入模型属性。
问题是当我尝试更新时,我的选择仍然正确填充,但未选择实际值。 “selected”属性没有选项可以正确初始化选择。
这真的很奇怪,因为我有一个spring roo的示例应用程序(petclinic),实际上使用相同类型的转换器正确填充选择。
我找到这个工作的唯一方法是将“.id”添加到路径中:
<form:select id="id_a" items="${items}" path="builder.id" itemValue="id" />
但是这样在提交时我在控制器中收到一个只有id设置的空“构建器”,而不是在调用正确的转换器时我正常接收的comprete对象。
我真的不知道两个应用程序之间的区别是什么让一个工作而不是另一个...即使是spring库版本也是一样的!
答案 0 :(得分:2)
我发现了问题。似乎在工作应用程序的web.xml中有另一个我没有使用的过滤器,只是添加这个使得一切正常:
<filter>
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这真的很奇怪,因为我发现这是强制性的,甚至与弹簧标签没什么联系,以使它们按预期工作!
答案 1 :(得分:0)
我认为你应该为实体类(BuilderType)定义equals方法,并按id比较实例。否则,表单生成无法从选项的项列表中找到当前值。
您可以通过在BuilderType中实现时检查对equals的调用来验证这一点。
我遇到了同样的问题,并且能够在this comment和Spring Data book中的示例代码(AbstractEntity.java)的帮助下解决它。