我的问题归结为:你如何让 spring mvc@ModelAttribute
在它已经被填充后调用?
详细地说,我正在使用 Ashish Sarin 的Portlets in Action
的第 8 章中的 BookCatalog 示例(这真的很好),我遇到了一个问题,
@ModelAttribute
即使在连续加载时,也只调用一次带有注释的方法。例如:
- 显示 BookCatalog Portlet
- 单击编辑 Book1。Book1 显示在编辑窗体中
- 点击首页
- 单击编辑 Book2。Book1仍然显示在编辑表单中
我在每个方法的开头添加了 sysouts,以查看在哪里调用了什么。结果如下:
showBooks
getBook!
initBinder
showEditBookForm
showBooks
initBinder <- Where is getBook!?
showEditBookForm
我在某处读到,@ModelAttribute
只要@ModelAttribute
请求参数,就会调用方法。所以我尝试添加@ModelAttribute("book") Book book
到 showEditBookForm 但似乎仍然没有触发该@ModelAttribute
方法。
我正在使用 Spring 3.1.3.RELEASE 并使用 maven 部署到 Liferay 6.1.1。
任何援助将不胜感激!
编辑书控制器:
@Controller
@RequestMapping(value="VIEW")
@SessionAttributes({"book"})
public class EditBookController {
...
@RenderMapping(params="myaction=editBookForm")
public String showEditBookForm(@ModelAttribute("book") Book book) {
System.out.println("showEditBookForm");
return "editBookForm"
}
@InitBinder("book")
public void initBinder(WebDataBinder binder) {
System.out.println("initBinder");
binder.registerCustomEditor(Long.class, new LongNumberPropertyEditor());
binder.setDisallowedFields(new String[] {"isbnNumber"});
}
@ModelAttribute("book")
public Book getBook(@RequestParam Long isbnNumber) {
System.out.println("getBook!");
return bookService.getBook(isbnNumber);
}
...
}
图书控制器:
@Controller
@RequestMapping(value = "VIEW")
public class BookController {
...
@RenderMapping
public String showBooks(RenderResponse response,SessionStatus sessionStatus) {
System.out.println("showBooks");
return "home";
}
...
}