@ModelAttribute в методе - PullRequest
       113

@ModelAttribute в методе

6 голосов
/ 02 декабря 2010

Представьте себе код, подобный этому:

@RequestMapping(value="/users", method=RequestMethod.GET)
public String list(Model model) {
    ...
}

@InitBinder("user")
public void initBinder(WebDataBinder binder) {
    binder.setDisallowedFields("password"); // Don't allow user to override the value
}

@ModelAttribute("user")
public User prepareUser(@RequestParam("username") String username){
    ...
}

@RequestMapping(value="/user/save", method=RequestMethod.POST)
public String save(@ModelAttribute("user") User user, Model model) {        
    ...
}

Я использую привязку init, чтобы избежать связывания поля, и помечаю метод (prepareUser ()) с помощью @ModelAttribute, чтобы подготовить мой объект User до его привязки. Поэтому, когда я вызываю / user / save, initBinder () и prepareUser () выполняются.

Я установил «user» в @InitBinder и @ModelAttribute, чтобы Spring-MVC мог понять, что эти методы следует применять только перед выполнением метода с @ModelAttribute («user»).

Проблема заключается в том, что метод, аннотированный @ModelAttribute ("пользователь"), выполняется перед каждым сопоставленным методом этого контроллера. Например, если я вызываю / users prepare, пользователь выполняется перед методом list (). Как я могу сделать так, чтобы этот подготовитель выполнялся только перед методом save (), имеющим все методы в одном контроллере?

Спасибо

1 Ответ

7 голосов
/ 02 декабря 2010

Это не совсем то, для чего @ModelAttribute. Если вы используете его как параметр метода, он помещает аннотированный параметр в модель (это нормально). Если вы помещаете его в метод, он вызывается каждый раз для предоставления справочных данных, к которым должен иметь доступ каждый метод в контроллере.

Если вы хотите взять под контроль создание объекта User, у вас есть несколько вариантов. Два наиболее очевидных для меня:

  1. Используйте метод InitBinder для добавления нового пользовательского редактора (класс PropertyEditor) для построения объектов User,
  2. Используйте сервис преобразования в Spring 3 для преобразования строковых имен пользователей в объекты User.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...