Что означает аннотация @ModelAttribute на уровне аргумента метода? - PullRequest
6 голосов
/ 15 января 2011

Ссылка на Spring 3 учит нас:

Когда вы помещаете его в параметр метода, @ModelAttribute отображает атрибут модели в конкретный аннотированный параметр метода

Я не понимаю это магическое заклинание, потому что я уверен, что псевдоним объекта модели (значение ключа, если используется ModelMap в качестве возвращаемого типа) передан в View после выполнения метода обработчика запроса.Поэтому, когда метод обработчика запросов выполняет, имя объекта модели не может быть сопоставлено с параметром метода.

Чтобы разрешить это противоречие, я пошел к stackoverflow и нашел этот подробный пример.Автор примера сказал:

// Модель "personAttribute" была передана в контроллер из JSP

Кажется, он очарован ссылками Spring...

Чтобы рассеять прелести, я развернул его пример приложения в своей среде и жестоко вырезал аннотацию @ModelAttribute из метода MainController.saveEdit().В результате приложение работает без каких-либо изменений!Итак, я делаю вывод: аннотация @ModelAttribute не требуется для передачи значений полей веб-формы в поля аргумента.Тогда я остановился на вопросе: что означает аннотация @ModelAttribute?Если единственным способом является установка псевдонима для объекта модели в View, то почему этот способ лучше, чем явное добавление объекта в ModelMap?

1 Ответ

8 голосов
/ 16 января 2011

Дело в том, что @ModelAttribute является необязательным - если аргумент не аннотирован и его тип не имеет особого значения (т. Е. Это не HttpServletRequest, ModelMap и т. Д.), Он обрабатывается как @ModelAttribute -аннотированный аргумент .

Итак, @ModelAttribute эффективно требуется в двух случаях:

  • Для указания имени атрибута. Если @ModelAttribute опущен или имеет пустой value, используется имя по умолчанию (введите имя аргумента с декапитализированной первой буквой).

  • Если тип аргумента имеет особое значение. Например, если ваш объект домена, переданный как атрибут, расширяет java.security.Principal, вам нужно аннотировать его, в противном случае Spring вместо этого передаст результат HttpServletRequest.getUserPrincipal().

Некоторые люди склонны использовать @ModelAttribute без реальной необходимости для документирования значения аргументов.

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