私の質問は要約すると、Spring MVC@ModelAttribute
がすでに入力された後、どのように呼び出すようにしますか?
詳述すると、私はアシシュ・サリンによるPortlets in Actionの第8章のBookCatalogの例をいじって
います(これは本当に良いです)。そして、注釈が付けられたメソッド
@ModelAttribute
が連続したロードでも一度だけ呼び出されるという問題に遭遇しました。例えば:
- BookCatalogポートレットが表示されます
- [ブックの編集1]をクリックします。Book1が編集フォームに表示されます
- ホームをクリック
- [Book2の編集]をクリックします。Book1は引き続き編集フォームに表示されます
各メソッドの先頭にsysoutを追加して、何がどこで呼び出されているかを確認しました。結果は次のとおりです。
showBooks
getBook!
initBinder
showEditBookForm
showBooks
initBinder <- Where is getBook!?
showEditBookForm
パラメータが要求さ@ModelAttribute
れるたびにメソッドが呼び出されることをどこかで読みました。@ModelAttribute
そこで@ModelAttribute("book") Book book
、showEditBookFormに追加しようとしましたが、それでもメソッドがトリガーされないようです@ModelAttribute
。
Spring 3.1.3.RELEASEを使用しており、Mavenを使用してLiferay6.1.1にデプロイしています。
どんな援助もいただければ幸いです!
EditBookController:
@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);
}
...
}
BookController:
@Controller
@RequestMapping(value = "VIEW")
public class BookController {
...
@RenderMapping
public String showBooks(RenderResponse response,SessionStatus sessionStatus) {
System.out.println("showBooks");
return "home";
}
...
}