【问题标题】:Save Many-to-Many in Spring MVC在 Spring MVC 中保存多对多
【发布时间】:2023-03-17 20:48:02
【问题描述】:

我在 Restaurant 和 Tag 之间建立了多对多的关系。这是我的实体:

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;

还有:

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 ModelAndView myrestaurantadd(HttpServletRequest request,
            HttpServletResponse response, Restaurant restaurant,  String[] tags)   throws Exception {
        for(String tag : tags){
            Tag x = new Tag();
            x.setName(tag);
        restaurant.getTags().add(x);
        }

在我的jsp中:

<form:form action="myrestaurantadd.htm" modelAttribute="restaurant" commandName="restaurant">
(...)
<form:select path="tags" multiple="true" items="${tagList}" itemLabel="name" itemValue="id"/>

一切正常,我的标签有多个选择,但是当我点击“保存”时,我收到了这个错误:

> org.springframework.web.util.NestedServletException:
> Request processing failed; nested
> exception is
> org.springframework.beans.BeanInstantiationException:
> Could not instantiate bean class
> [[Ljava.lang.String;]: No default
> constructor found; nested exception is
> java.lang.NoSuchMethodException:
> [Ljava.lang.String;.<init>()

【问题讨论】:

标签: hibernate spring-mvc many-to-many


【解决方案1】:

您必须为控制器上的restaurant 对象的tags 属性定义一个自定义属性编辑器。

@InitBinder
    protected void initBinder(HttpServletRequest request,
            ServletRequestDataBinder binder) throws Exception {

        super.initBinder(request, binder);

        binder.registerCustomEditor(List.class, "tags",new CustomCollectionEditor(List.class){

            @Override
            protected Object convertElement(Object element) {
                Tag tag = new Tag();

                if (element != null) {
                    Long id = Long.valueOf(element.toString());
                    tag.setId(id);
                }
                return tag;
            }
        });

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    相关资源
    最近更新 更多