Spring MVC 多对多多选

Posted

技术标签:

【中文标题】Spring MVC 多对多多选【英文标题】:Spring MVC ManyToMany in MultipleSelect 【发布时间】:2011-07-09 12:14:37 【问题描述】:

我遇到了餐厅和标签类之间的多对多关系的问题。我得到了:

public class Tag 
    @Id
    private int id;
    private String name;
    @ManyToMany
    @JoinTable(name="restaurant_tag",
            joinColumns=@JoinColumn(name="tag_id"),
            inverseJoinColumns=@JoinColumn(name="restaurant_id"))
    private List<Restaurant> restaurants;

和:

public class Restaurant 
    @Id
    @GeneratedValue
    private int id;
    (...)
    @ManyToMany
    @JoinTable(name="restaurant_tag",
            joinColumns=@JoinColumn(name="restaurant_id"),
            inverseJoinColumns=@JoinColumn(name="tag_id"))
    private List<Tag> tags;

在我的jsp中我得到了:

<form:select multiple="true" path="tags">
<form:options items="$tagList " itemValue="id" itemLabel="name" />
</form:select>

在我的控制器中,我得到了:

public ModelAndView myrestaurantadd(HttpServletRequest request,
            HttpServletResponse response, Restaurant restaurant)
            throws Exception 
restaurantDAO.saveRestaurant(restaurant);

当我点击保存按钮时,出现错误:

字段“标签”上的对象“命令”中的字段错误:拒绝值 [[Ljava.lang.String;@5babd8cb];代码 [typeMismatch.command.tags,typeMismatch.tags,typeMismatch.java.util.List,typeMismatch];参数 [org.springframework.context.support.DefaultMessageSourceResolvable: 代码 [command.tags,tags];论据 [];默认消息[标签]];默认消息 [无法将 [java.lang.String[]] 类型的属性值转换为属性“标签”所需的类型 [java.util.List];嵌套异常是 java.lang.IllegalArgumentException:无法将类型 [java.lang.String] 的值转换为属性“tags [0]”所需的类型 [beans.Tag]:找不到匹配的编辑器或转换策略]],根本原因 org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 个错误

【问题讨论】:

【参考方案1】:
 [Failed to convert property value of type [java.lang.String[]] to required type [java.util.List] for property 'tags'; 

您如何处理控制器上的对象。您必须在控制器处理程序方法中接受java.util.List,而实际传递的对象是String[]。尝试将其作为 String[] 处理并将其转换为控制器中的 List。

编辑: 关于你的评论,我怀疑是这样的。标签以 String[] 标签的形式从 jsp 传递,您正在捕获一个需要 List 的 Restaurant 对象,因此会出现错误。试试下面的

public ModelAndView myrestaurantadd(HttpServletRequest request, HttpServletResponse response, Restaurant restaurant, String[] tags) throws Exception 
//Convert the String array into List<Tag> and set this list in the restaurant object
//Note that the Restaurant object obtained as the method argument with contain a null tag list, so you would need to set the tag list before saving
//Save the Restaurant object now

【讨论】:

我只有在我的控制器中:public ModelAndView myrestaurantadd(HttpServletRequest request, HttpServletResponse response, Restaurant restaurant) throws Exception restaurantDAO.saveRestaurant(restaurant);

以上是关于Spring MVC 多对多多选的主要内容,如果未能解决你的问题,请参考以下文章

多对多 Spring MVC mappedBy 引用了一个未知的目标实体属性

spring data jpa关联查询(一对一对多多对多)

Hibernate映射( 多对一对一对多多对多)的配置方法

总结一下数据库的 一对多多对一对多对多 关系

hibernate多对多查询

多对多 Spring Boot JPA 未填充多对多表