使用列表和复选框的Spring MVC数据绑定

我已经知道有关此问题的问题,但我找到的答案都没有解决我的问题。

我的数据库有多对多的关系。 我正在使用JPA和Hibernate来创建和更改我的表。 这是我的模型类:

Book.java

@Entity @Table(name="tb_books") public class Book implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", updatable = false, nullable = false, insertable = false) private Integer id; @Column(name = "title", nullable = false, length = 255) private String title; @Column(name = "author", nullable = false, length = 255) private String author; @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER) @JoinTable(name = "book_tag", joinColumns = { @JoinColumn(name = "fk_book") }, inverseJoinColumns = { @JoinColumn(name = "fk_tag") }) private List tags; //getters, setters, equals and hash methods... } 

Tag.java

 @Entity @Table(name="tb_tags") public class Tag implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", updatable = false, nullable = false) private Integer id; @Column(name = "description", nullable = false, length = 255) private String description; //getters, setters, equals and hash methods... } 

我正在尝试使用Spring MVC从JSP提交的数据在book_tag表上进行插入和更新。 这是我的控制器和插入页面:

BookController.java

 @Controller @RequestMapping(value = "/book") public class BookController { @Autowired private BookService bookService; /* Controller method that gets us to the adding book page. */ @RequestMapping(value = "/add", method = RequestMethod.GET) public ModelAndView addBookPage() { List tags = tagService.getTags(); //all tags from the database ModelAndView modelAndView = new ModelAndView("form-book"); modelAndView.addObject("book", new Book()); modelAndView.addObject("tags", tags); return modelAndView; } @RequestMapping(value = "/add", method = RequestMethod.POST) public ModelAndView addBookProcess(@ModelAttribute Book book) { bookService.addBook(book); return new ModelAndView("redirect:/book/add"); } //... } 

外形book.jsp

 
Title:
Author:

一切都运行正常,除非我尝试更新或插入带有一个或多个复选框的书籍。 当我尝试这样做时,我只是得到一个“错误请求”页面,我想象因为我正在做的有关数据绑定的错误。

这是我应该处理这种情况的方式吗? 有没有更好的办法? 我究竟做错了什么?

显然,来自复选框的List实际上是一个字符串数组,无法转换为标签列表,如模型类所定义。

我通过创建自定义PropertyEditor来解决我的问题,这允许我将复选框与标签列表绑定。

 public class TagPropertyEditor extends PropertyEditorSupport { private TagService tagService; public TagPropertyEditor(TagService tagService){ this.tagService = tagService; } @Override public String getAsText() { return ((Tag) getValue()).getId().toString(); } @Override public void setAsText(String incomingId) throws IllegalArgumentException { Tag tag = tagService.getTag(Integer.valueOf(incomingId)); setValue(tag); } } 

然后在我的BookController上注册:

 //... @InitBinder public void initBinder(WebDataBinder binder){ binder.registerCustomEditor(Tag.class, new TagPropertyEditor(tagService)); } 

这是我的JSP上的checboxes标签: