2

我遇到了转换器和绑定的问题。我有一个带有表单的页面:选择我将对象列表与 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 集,而不是在调用正确的转换器时我通常收到的完整对象。

我真的不知道使一个工作而不是另一个工作的两个应用程序之间有什么区别......甚至弹簧库版本都是一样的!

4

2 回答 2

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>

这真的很奇怪,因为我没有发现这是强制性的,甚至与弹簧标签几乎没有联系以使它们按预期工作!

于 2012-11-29T14:05:43.480 回答
0

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

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

我遇到了同样的问题,并且能够在此评论和Spring Data book中的示例代码(AbstractEntity.java)的帮助下解决它。

于 2013-01-24T13:45:53.903 回答