在Spring MVC中保存多对多 [英] Save Many-to-Many in Spring MVC

查看:156
本文介绍了在Spring MVC中保存多对多的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

餐厅和标签之间有很多关系。以下是我的实体:

  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>标签;

和:

  public class Tag {
@Id
private int id;
私人字符串名称;
@ManyToMany
@JoinTable(name =restaurant_tag,
joinColumns = {@ JoinColumn(name =tag_id)},
inverseJoinColumns = {@ JoinColumn(name = restaurant_id)})
私人列表< Restaurant>餐厅;

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

  public ModelAndView myrestaurantadd(HttpServletRequest请求,
HttpServletResponse响应,Restaurant restaurant,String [] tags)抛出异常{
for(String tag:tags){
标签x =新标签();
x.setName(tag);
restaurant.getTags()。add(x);
}

而在我的jsp中:

 < form:form action =myrestaurantadd.htmmodelAttribute =restaurantcommandName =restaurant> 
(...)
< form:select path =tagsmultiple =trueitems =$ {tagList}itemLabel =nameitemValue =id/>

一切显示正常,我有多个选择与我的标签,但是当我点击'保存'时,我出现此错误:

 > org.springframework.web.util.NestedServletException:
>请求处理失败;嵌套
>例外是
> org.springframework.beans.BeanInstantiationException:
>无法实例化bean类
> [[Ljava.lang.String;]:无默认
>找到构造函数;嵌套异常是
> java.lang.NoSuchMethodException:
> [Ljava.lang.String;。< init>()


解决方案

您必须为您的控制器上的餐厅对象的标签属性定义自定义属性编辑器。

  @InitBinder 
保护无效initBinder(HttpServletRequest请求,
ServletRequestDataBinder联编程序)抛出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);
}
返回标记;
}
});

}


I got relation many to many between Restaurant and Tag. Here are my entities:

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;

And:

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;

In my controller (add) I got:

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);
        }

And in my jsp:

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

everything shows ok, I got multiple select with my tags, but when I click 'save', I got this error:

> 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>()

解决方案

You will have to define a custom property editor for the tags property of your restaurant object on your controller.

@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;
            }
        });

    }

这篇关于在Spring MVC中保存多对多的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆