有没有办法使@ModelAttribute动态化?

时间:2012-02-21 00:22:52

标签: java spring spring-mvc

例如,在此控制器中:

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

是否可以使@ModelAttribute带注释的参数动态化?我希望能够将它用于多个对象,无论其类型如何。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

注释是在编译时定义的常量(这就是为什么只有一组有限的类型可用于注释方法/成员)。

这并不意味着它们不能是动态的,你只需要一些狡猾的工作(或另一个图书馆的部分)。

您可以创建一个小脚本语言并将表达式作为参数。这样,String值可能不是动态的,但您的语言对String中包含的表达式的作用可能是。

幸运的是,您不必编写自己的小语言,因为Spring已经为您完成了这项工作。 Spring Expression Language (SpEL)。我不确定SpEL是否会在这里帮助你,但值得一看。