Вы можете использовать аннотацию @ModelAttribute
:
-
В качестве аргумента метода в методах с аннотацией
@RequestMapping
для создания или доступа к объекту из модели и привязки его к запросу черезWebDataBinder
. -
Как аннотацию на уровне метода в классах, помеченных аннотациями
@Controller
или@ControllerAdvice
, которая помогает инициализировать модель перед вызовом метода с аннотацией@RequestMapping
. -
Для метода
@RequestMapping
, чтобы отметить, что его возвращаемое значение является атрибутом модели.
В этом разделе рассмотрены методы, аннотирование @ModelAttribute
– второй пункт в предыдущем списке. Контроллер может иметь любое количество методов, помеченных аннотацией @ModelAttribute
. Все такие методы вызываются перед методами с аннотацией @RequestMapping
в том же контроллере. Метод, аннотированный @ModelAttribute
, также может быть совместно использован контроллерами через аннотацию @ControllerAdvice
.
Методы с аннотацией @ModelAttribute
имеют гибкие сигнатуры методов. Они поддерживают многие из тех же аргументов, что и методы, помеченные аннотацией @RequestMapping
, за исключением самой аннотации @ModelAttribute
или всего, что связано с телом запроса.
В следующем примере показан метод, аннотированный @ModelAttribute
:
@ModelAttribute
public void populateModel(@RequestParam String number, Model model) {
model.addAttribute(accountRepository.findAccount(number));
// добавляем больше ...
}
@ModelAttribute
fun populateModel(@RequestParam number: String, model: Model) {
model.addAttribute(accountRepository.findAccount(number))
// добавляем больше ...
}
В следующем примере добавляется только один атрибут:
@ModelAttribute
public Account addAccount(@RequestParam String number) {
return accountRepository.findAccount(number);
}
@ModelAttribute
fun addAccount(@RequestParam number: String): Account {
return accountRepository.findAccount(number)
}
Object
, как объясняется в javadoc по Conventions
. Всегда можно присвоить явное имя с помощью перегруженного метода addAttribute
или через атрибут name
в аннотации @ModelAttribute
(для возвращаемого значения).Вы также можете использовать аннотацию @ModelAttribute
как аннотацию на уровне метода для методов, аннотированных @RequestMapping
, и в этом случае возвращаемое значение метода, аннотированного @RequestMapping
, будет интерпретироваться как атрибут модели. Обычно это не требуется, поскольку это логика работы по умолчанию в HTML-контроллерах, если только возвращаемое значение не является String
, которая в противном случае будет интерпретирована как имя представления. Аннотация @ModelAttribute
может также настраивать имя атрибута модели, как показано в следующем примере:
@GetMapping("/accounts/{id}")
@ModelAttribute("myAccount")
public Account handle() {
// ...
return account;
}
@GetMapping("/accounts/{id}")
@ModelAttribute("myAccount")
fun handle(): Account {
// ...
return account
}
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ