Ти можеш використовувати анотацію @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
}