2012-05-28 2 views
5

Я пытаюсь использовать тег select spring, чтобы выбрать несколько вариантов для заполнения списка. Мои теги выбора хорошо отображаются, и когда я выбираю опции, список правильно обновляется.Spring select multiple tag and binding

Единственная проблема, с которой я сталкиваюсь, - это когда я обрабатываю список с уже заполненным списком, мой тег select не выделяет выбранные параметры. Я пытаюсь отлаживать и вижу, что List не пуст, это действительно тег, который, кажется, не помещает выбранные параметры как выбранные.

Мой код:

@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> 

ответ

8

Это, вероятно, связано с тем, что список выбранных продуктов не содержит те же экземпляры, как полный список отображаемых продуктов.

Тег сравнивает продукты с equals(), и вы не переопределили equals()hashCode()) в своем классе продукта.

Таким образом, даже если выбранные продукты содержат Продукт с именем «foo», а полный список Продуктов также содержит Продукт с именем «foo», эти продукты не равны, а Spring, таким образом, не знает они являются одним и тем же продуктом и поэтому этот продукт должен быть выбран.

+0

Awesome! Я думал, что он использовал itemValue для сравнения! Действительно, использование equals имеет больше смысла ... – tibo