2010-12-02 2 views
6

Представьте код, как этот:@ModelAttribute в методе

@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) {   
    ... 
} 

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

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

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

Благодаря

+0

Что на самом деле делает `prepareUser`? – skaffman 2010-12-02 13:41:25

+0

@skaffman принимает параметр имени пользователя и загружает объект User из базы данных, поэтому все данные, которые не могут быть привязаны (например, пароль), не перезаписываются с нулевыми значениями, когда они сохраняются после привязки – Javi 2010-12-02 13:44:35

ответ

7

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

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

  1. Используйте метод InitBinder для добавления нового пользовательского редактора (класс PropertyEditor) для создания пользовательских объектов,
  2. Используйте conversion service in Spring 3 для преобразования строки имен пользователей к объектам пользователей.