Есть ли способ сделать динамический @ModelAttribute? - PullRequest
3 голосов
/ 21 февраля 2012

Например, в этом контроллере:

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

Возможно ли сделать аннотированный параметр @ModelAttribute динамическим?Я хочу иметь возможность использовать его для нескольких объектов, независимо от типа.

Ответы [ 2 ]

3 голосов
/ 07 февраля 2013

Вы можете создать экземпляр объекта модели динамически с помощью отражения, а затем вручную вызвать привязку, чтобы получить желаемый результат.

@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 голос
/ 21 февраля 2012

Аннотации - это константы, определенные во время компиляции (поэтому существует только ограниченный набор типов, которые можно использовать для методов / элементов аннотаций).

Это не означает, что они не могут быть динамическимитем не менее, вам просто потребуется некоторая хитрая работа с вашей стороны (или части другой библиотеки).

Вы можете создать небольшой язык сценариев и иметь выражение в качестве параметра.Таким образом, значение String может быть не динамическим, но то, что ваш язык делает с выражением, содержащимся в String, может быть.

К счастью, вам не нужно писать свой собственный маленький язык,потому что весна уже сделала это для вас. Язык выражений Spring (SpEL) .Я не уверен, что SpEL поможет вам прямо здесь, но это стоит посмотреть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...