Puedes utilizar la anotación @ModelAttribute:

  • Como argumento de método en métodos con la anotación @RequestMapping para crear o acceder a un objeto desde el modelo y vincularlo a una solicitud a través de WebDataBinder.

  • Como anotación a nivel de método en clases marcadas con anotaciones @Controller o @ControllerAdvice que ayuda a inicializar el modelo antes de llamar a un método con anotación de @RequestMapping.

  • Para que el método @RequestMapping indique que su valor de retorno es un atributo del modelo.

Esta sección cubre métodos; la anotación @ModelAttribute es el segundo elemento de la lista anterior. Un controlador puede tener cualquier número de métodos marcados con la anotación @ModelAttribute. Todos estos métodos se llaman antes que los métodos con la anotación @RequestMapping en el mismo controlador. Un método anotado con @ModelAttribute también se puede compartir entre controladores a través de la anotación @ControllerAdvice.

Los métodos con la anotación @ModelAttribute tienen firmas de método flexibles. Admiten muchos de los mismos argumentos que los métodos marcados con la anotación @RequestMapping, excepto la anotación @ModelAttribute en sí o cualquier cosa asociada con el cuerpo de la solicitud.

El siguiente ejemplo muestra un método anotado con @ModelAttribute:

Java
@ModelAttribute
public void populateModel(@RequestParam String number, Model model) {
    model.addAttribute(accountRepository.findAccount(number));
    // añadir más...
}
Kotlin
@ModelAttribute
fun populateModel(@RequestParam number: String, model: Model) {
    model.addAttribute(accountRepository.findAccount(number))
    // añadir más...
}

El siguiente ejemplo agrega solo un atributo:

Java
@ModelAttribute
public Account addAccount(@RequestParam String number) {
    return accountRepository.findAccount(number);
}
Kotlin
@ModelAttribute
fun addAccount(@RequestParam number: String): Account {
    return accountRepository.findAccount(number)
}
Si el nombre no se especifica explícitamente, entonces el nombre predeterminado se elige en función del tipo Object, como se explica en el javadoc en Convenciones. Siempre puedes asignar un nombre explícito usando la sobrecarga addAttribute o mediante el atributo name en la anotación @ModelAttribute (para el valor de retorno).

También puede utilizar la anotación @ModelAttribute como una anotación a nivel de método para los métodos anotados con @RequestMapping, en cuyo caso el valor de retorno del método anotado con @RequestMapping se interpretará como un atributo del modelo. Por lo general, esto no es necesario ya que es la lógica predeterminada en los controladores HTML a menos que el valor de retorno sea una String que de otro modo se interpretaría como el nombre de la vista. La anotación @ModelAttribute también puede personalizar el nombre del atributo del modelo, como se muestra en el siguiente ejemplo:

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