2011-11-18 72 views
3

我需要一些關於Spring 3.0 MVC和@ModelAttribute註釋方法參數的說明。我有一個控制器,它看起來像這樣的:Java - Spring 3.0 MVC和@ModelAttribute

RequestMapping(value = "/home") 
@Controller 
public class MyController { 

@RequestMapping(method = RequestMethod.GET) 
public ModelAndView foo() { 

       // do something 
} 

@RequestMapping(method = RequestMethod.POST) 
public ModelAndView bar(
     @ModelAttribute("barCommand") SomeObject obj) { 

        // do sometihng with obj and data sent from the form 
} 


} 

和我回到Home.jsp我有這樣一個它自己的數據發送到的myController的

<form:form action="home" commandName="barCommband"> 

</form:form 

的RequestMethod.POST方法現在形式如果我嘗試訪問回到Home.jsp我得到這個異常:

java.lang.IllegalStateException: 
Neither BindingResult nor plain target object for bean name 'barCommand' available as request attribute 

要解決此我發現我需要添加

@ModelAttribute("barCommand") SomeObject obj 

參數給MyController的Request.GET方法,即使我不會在該方法中使用obj。再舉例來說,如果添加另一種形式具有不同的CommandName像這樣回到Home.jsp:

<form:form action="home/doSomething" commandName="anotherCommand"> 

</form:form 

我也有增加的RequestMethod.GET,這將是這個樣子的是參數:

@RequestMapping(method = RequestMethod.GET) 
public ModelAndView foo(@ModelAttribute("barCommand") SomeObject obj1, 
    @ModelAttribute("anotherCommand") AnotherObj obj2) { 

       // do something 
} 

或我得到相同的例外。我問的是,如果這是一個正常的Spring 3 MVC行爲,或者如果我做錯了什麼。爲什麼我需要將所有@ModelAttribute參數放在RequestMethod.GET方法上?

在此先感謝您的幫助

斯特凡諾

回答

3

Here是Spring MVC的參考。通過它看上去簡要,發現2點的方法:

  1. @InitBinder
  2. @ModelAttribute( 「bean_name」)與方法。

您可以使用第一個自定義數據綁定,因此,在即時創建命令對象。其次,您可以標註法,並用此名稱預填充模型屬性:

@ModelAttribute("bean_name") 
public Collection<PetType> populatePetTypes() { 
    return this.clinic.getPetTypes(); 
} 

我希望這將填充名爲「bean_name」模型屬性,如果它是空的。

相關問題