代码之家  ›  专栏  ›  技术社区  ›  iftheshoefritz

绑定到集合的Spring MVC复选框标记需要对象,但验证需要对象.id

  •  1
  • iftheshoefritz  · 技术社区  · 14 年前

    在我的SpringMVC项目中,我有一个Class1的更新页面,它必须显示一个表单列表:绑定到Class1上实体集合的复选框标记。

    类1.java:

    class Class1 {
      private Set<Class2> set;
      //... other fields 
    }
    

    在updateClass1.jspx中:

    <c:forEach items="${allClass2Instances}" var="class2">
       <form:checkbox label="${class2.name}" path="set" value="${class2}"/><br/>
    </c:forEach>
    

    使用如上所述的复选框标记,当我显示页面时,如果Class2实例是Class1上设置的一部分,则复选框会被勾选,如果不是,则不勾选。但是当我单击Submit时,我会得到以下错误:

    Failed to convert property value of type 'java.lang.String[]' to required type 'java.util.Set' for property 'set'; nested exception is org.springframework.core.convert.ConversionFailedException: Unable to convert value "Name 1" from type 'java.lang.String' to type 'java.lang.Long'; nested exception is java.lang.NumberFormatException: For input string: "Name1"
    

    据我所知,当页面被填充时,form:checkbox标记需要一个实例来设置正确的选中/未选中值,但是在提交时,jsp将向需要ID的转换器发送一个class2.toString()值数组。相反,当我将标签更改为以下内容时:

    <form:checkbox label="${class2.name}" path="set" value="${class2.id}"/><br/>
    

    绑定工作正常,但是当我查看更新页面时,复选框没有正确地勾选/取消勾选,因为标记不知道传入的值是对象ID。

    如何使提交后的绑定与复选框标记期望的一致?

    如果这很重要-这都在roo生成的脚手架页面内。

    1 回复  |  直到 14 年前
        1
  •  0
  •   iftheshoefritz    14 年前

    1. <form:checkbox>
    2. <input type="checkbox">

    Converter<Class2, String> getClass2Converter() {
        return new Converter<Class2, String>() {
            public String convert(Class2 instance) {
                return "" + instance.getId();
            }
        };
    }
    

    <field:display> fmtCollectionToString toString spring:eval