2012-02-21 244 views
3

例如,在此控制器:有沒有辦法讓@ModelAttribute動態?

@RequestMapping(value = "/save", method = RequestMethod.POST) 
    public @ResponseBody String save(
      @ModelAttribute("newInstance") MyClass newInstance) { . . . } 

是否有可能使@ModelAttribute標註的參數動態?我希望能夠將它用於多個對象,而不管類型如何。

回答

1

註解是在編譯時定義的常量(這就是爲什麼只有一組有限的類型可用於註釋方法/成員)。

這並不意味着他們不能動態,但你只需要一些狡猾的工作(或另一個庫的一部分)。

您可以創建一個小型腳本語言並將表達式作爲參數。這樣,String值可能不是動態的,但是您的語言對String中包含的表達式可以做什麼。

幸運的是,你不必編寫自己的小語言,因爲Spring已經爲你做了。 Spring Expression Language (SpEL)。我不確定SpEL是否會幫助你,但值得一看。

3

您可以通過反射動態實例化模型對象,然後手動觸發綁定以獲得所需的結果。

@RequestMapping(method=RequestMethod.POST,value="/add/{modelSelect}") 
public String saveEntity(@PathVariable String modelSelect, WebRequest request){ 
    Object domainObject = //create object with your custom strategy using the modelSelect  
    WebRequestDataBinder binder = new WebRequestDataBinder(domainObject); 
    binder.bind(request); 
    //do something with the domain object 
    return "/somePage"; 
} 

這也可能是有用的http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/web/bind/support/WebRequestDataBinder.html

+0

完美的答案。 – 2015-05-22 15:03:28