Вы можете использовать аннотацию @ModelAttribute:

  • В качестве аргумента метода в методах с аннотацией @RequestMapping для создания или доступа к объекту из модели и привязки его к запросу через WebDataBinder.

  • Как аннотацию на уровне метода в классах, помеченных аннотациями @Controller или @ControllerAdvice, которая помогает инициализировать модель перед вызовом метода с аннотацией @RequestMapping.

  • Для метода @RequestMapping, чтобы отметить, что его возвращаемое значение является атрибутом модели.

В этом разделе рассмотрены методы, аннотирование @ModelAttribute – второй пункт в предыдущем списке. Контроллер может иметь любое количество методов, помеченных аннотацией @ModelAttribute. Все такие методы вызываются перед методами с аннотацией @RequestMapping в том же контроллере. Метод, аннотированный @ModelAttribute, также может быть совместно использован контроллерами через аннотацию @ControllerAdvice.

Методы с аннотацией @ModelAttribute имеют гибкие сигнатуры методов. Они поддерживают многие из тех же аргументов, что и методы, помеченные аннотацией @RequestMapping, за исключением самой аннотации @ModelAttribute или всего, что связано с телом запроса.

В следующем примере показан метод, аннотированный @ModelAttribute:

Java
@ModelAttribute
public void populateModel(@RequestParam String number, Model model) {
    model.addAttribute(accountRepository.findAccount(number));
    // добавляем больше ...
}
Kotlin
@ModelAttribute
fun populateModel(@RequestParam number: String, model: Model) {
    model.addAttribute(accountRepository.findAccount(number))
    // добавляем больше ...
}

В следующем примере добавляется только один атрибут:

Java
@ModelAttribute
public Account addAccount(@RequestParam String number) {
    return accountRepository.findAccount(number);
}
Kotlin
@ModelAttribute
fun addAccount(@RequestParam number: String): Account {
    return accountRepository.findAccount(number)
}
Если имя не задано явным образом, то имя по умолчанию выбирается на основе типа Object, как объясняется в javadoc по Conventions. Всегда можно присвоить явное имя с помощью перегруженного метода addAttribute или через атрибут name в аннотации @ModelAttribute (для возвращаемого значения).

Вы также можете использовать аннотацию @ModelAttribute как аннотацию на уровне метода для методов, аннотированных @RequestMapping, и в этом случае возвращаемое значение метода, аннотированного @RequestMapping, будет интерпретироваться как атрибут модели. Обычно это не требуется, поскольку это логика работы по умолчанию в HTML-контроллерах, если только возвращаемое значение не является String, которая в противном случае будет интерпретирована как имя представления. Аннотация @ModelAttribute может также настраивать имя атрибута модели, как показано в следующем примере:

Java
@GetMapping("/accounts/{id}")
@ModelAttribute("myAccount")
public Account handle() {
    // ...
    return account;
}
Kotlin
@GetMapping("/accounts/{id}")
@ModelAttribute("myAccount")
fun handle(): Account {
    // ...
    return account
}