使用列表和复选框的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
一切都运行正常,除非我尝试更新或插入带有一个或多个复选框的书籍。 当我尝试这样做时,我只是得到一个“错误请求”页面,我想象因为我正在做的有关数据绑定的错误。
这是我应该处理这种情况的方式吗? 有没有更好的办法? 我究竟做错了什么?
显然,来自复选框的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标签: