You can use the @ModelAttribute
annotation:
-
As a method argument in methods with the
@RequestMapping
annotation to create or access an object from the model and bind it to a request viaWebDataBinder
. -
As a method-level annotation in classes marked with
@Controller
or@ControllerAdvice
annotations that helps initialize the model before calling a method with the@RequestMapping
annotation. -
For the
@RequestMapping
method to indicate that its return value is a model attribute.
This section covers methods, the @ModelAttribute
annotation is the second item in the previous list. A controller can have any number of methods marked with the @ModelAttribute
annotation. All such methods are called before methods with the @RequestMapping
annotation in the same controller. A method annotated with @ModelAttribute
can also be shared between controllers via the @ControllerAdvice
annotation.
Methods with the @ModelAttribute
annotation have flexible method signatures. They support many of the same arguments as methods marked with the @RequestMapping
annotation, except for the @ModelAttribute
annotation itself or anything associated with the request body.
The following example shows a method annotated with @ModelAttribute
:
@ModelAttribute
public void populateModel(@RequestParam String number, Model model) {
model.addAttribute(accountRepository.findAccount(number));
// add more...
}
@ModelAttribute
fun populateModel(@RequestParam number: String, model: Model) {
model.addAttribute(accountRepository.findAccount(number))
// add more...
}
The following example adds only one attribute:
@ModelAttribute
public Account addAccount(@RequestParam String number) {
return accountRepository.findAccount(number);
}
@ModelAttribute
fun addAccount(@RequestParam number: String): Account {
return accountRepository.findAccount(number)
}
Object
type, as explained in the javadoc at
Conventions
. You can always assign an explicit name using the
addAttribute
overload or through the
name
attribute in the
@ModelAttribute
annotation (for the return value).
You can also use the @ModelAttribute
annotation as a method-level annotation for methods annotated with @RequestMapping
, in which case the return value of the method annotated with @RequestMapping
will be interpreted as a model attribute. This is usually not required as it is the default operating logic in HTML controllers, unless the return value is a String
, which would otherwise be interpreted as the name of the view. The @ModelAttribute
annotation can also customize the model attribute name, as shown in the following example:
@GetMapping("/accounts/{id}")
@ModelAttribute("myAccount")
public Account handle() {
// ...
return account;
}
@GetMapping("/accounts/{id}")
@ModelAttribute("myAccount")
fun handle(): Account {
// ...
return account
}
GO TO FULL VERSION