弹簧形式:选择不使用选项"selected"属性进行渲染



我遇到了转换器和绑定的问题。我有一个带有表单的页面:选择将对象列表与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,并在到达控制器之前放入model属性中。

问题是,当我尝试更新时,我的选择仍然正确填充,但没有选择实际值。没有属性为"selected"的选项可以正确初始化select。

这真的很奇怪,因为我有一个spring-roo的示例应用程序(petclinic),它实际上使用了相同类型的转换器来正确地填充select。

我找到的唯一方法是将".id"添加到路径中:

<form:select id="id_a" items="${items}" path="builder.id" itemValue="id" />

但通过这种方式,在提交时,我会在控制器中接收到一个空的"构建器",其中只有id集,而不是在调用正确的转换器时正常接收到的压缩对象。

我真的不知道这两个应用程序之间的区别是什么,这两个程序使一个工作而不是另一个。。。即使是spring库版本也是一样的!

我发现了问题。在工作应用程序的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>

这真的很奇怪,因为我从未发现这是强制性的,甚至与spring标签没有任何联系,以使它们按预期工作

我认为应该为实体类(BuilderType)定义equals方法,并按id比较实例。否则,表单生成无法从选项的项列表中找到当前值。

当在BuilderType中实现时,可以通过检查对equals的调用来验证这一点。

我也面临着同样的问题,并能够在Spring Data书中的这篇评论和示例代码(AbstractEntity.java)的帮助下解决它。

相关内容

最新更新