Spring选择多个标签并绑定


问题内容

我正在尝试使用spring的select标签选择多个选项来填充列表。我的选择标签显示良好,当我选择选项时,列表会正确更新。

我唯一的问题是当使用已填充的List渲染for时,我的select标签不会突出显示所选的选项。我已经尝试调试,并且可以看到列表不是空的,它实际上是标记,似乎没有将所选选项标记为已选中。

我的代码:

@Entity
public class ProductsGroup
{
    @Version  @Column(name = "version")
    private Integer version;
    @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id")
    private Integer id;

    @ManyToMany(fetch = FetchType.EAGER)
    private List<Product> products;

    public List<Product> getProducts()
    {
        return products;
    }

    public void setProducts(List<Product> products)
    {
        this.products = products;
    }
}

@Entity
public class Product
{
    @Version @Column(name = "version")
    private Integer version;

    @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id")
    private Long id;

    private String name;

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }
}

<form:form action="${action}" class="fancyform" commandName="productsGroup" id="productForm">
    ....
    <form:select path="products" items="${products}" itemLabel="name" itemValue="id" multiple="true"/>
    ....
</form:form>

问题答案:

可能是由于所选产品的列表不包含与所显示产品的完整列表相同的实例。

标签会将产品与进行比较equals(),并且您尚未在Product类中覆盖equals()(和hashCode())。

因此,即使选定的产品包含名称为“ foo”的产品,并且产品的完整列表也包含名称为“
foo”的产品,这些产品也不相等,因此Spring并不知道它们是相同的产品,因此应选择该产品。