我遇到了转换器和绑定的问题。我有一个带有表单的页面:选择我将对象列表与 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 时一切正常,我在选择字段中看到了描述,当提交表单时,id 被转换为真正的 bean 并在到达控制器之前放入模型属性中。
问题是当我尝试更新时,我的选择仍然正确填充,但未选择实际值。没有属性“selected”的选项可以正确初始化选择。
这真的很奇怪,因为我有一个 spring roo 的示例应用程序(宠物诊所),实际上使用相同类型的转换器正确填充了选择。
我发现让这个工作的唯一方法是在路径中添加“.id”:
<form:select id="id_a" items="${items}" path="builder.id" itemValue="id" />
但是通过这种方式提交时,我在控制器中收到了一个空的“构建器”,其中只有 id 集,而不是在调用正确的转换器时我通常收到的完整对象。
我真的不知道使一个工作而不是另一个工作的两个应用程序之间有什么区别......甚至弹簧库版本都是一样的!