对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

@ModelAttribute

您可以使用@ModelAttribute方法参数上的注释,以从中访问属性 模型,或者如果不存在,则将其实例化。model 属性也与 名称与字段名称匹配的 HTTP Servlet 请求参数中的值。这是被引用的 作为数据绑定,它使您不必处理解析和转换单个 查询参数和表单字段。以下示例显示了如何执行此作:spring-doc.cadn.net.cn

@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
public String processSubmit(@ModelAttribute Pet pet) { (1)
	// method logic...
}
1 绑定Pet.
@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
fun processSubmit(@ModelAttribute pet: Pet): String { (1)
	// method logic...
}
1 绑定Pet.

Pet上述实例以以下方式之一获取:spring-doc.cadn.net.cn

使用 @ModelAttribute 方法的一种替代方法 提供它或依靠框架创建模型属性,就是有一个Converter<String, T>以提供实例。当模型属性 name 与请求值(例如 path 变量或请求)的名称匹配 参数,并且有一个ConverterString设置为模型属性类型。 在以下示例中,模型属性名称为account与 URI 匹配的 路径变量account,并且有一个注册的Converter<String, Account>哪 可以加载Account从数据存储:spring-doc.cadn.net.cn

@PutMapping("/accounts/{account}")
public String save(@ModelAttribute("account") Account account) { (1)
	// ...
}
1 绑定Account使用显式属性名称。
@PutMapping("/accounts/{account}")
fun save(@ModelAttribute("account") account: Account): String { (1)
	// ...
}
1 绑定Account使用显式属性名称。

获取模型属性实例后,应用数据绑定。这WebDataBinder类匹配 Servlet 请求参数名称(查询参数和表单 fields) 转换为目标上的字段名称Object.匹配字段在类型之后填充 必要时应用转换。有关数据绑定(和验证)的更多信息,请参阅验证。有关自定义数据绑定的更多信息,请参阅DataBinder.spring-doc.cadn.net.cn

数据绑定可能会导致错误。默认情况下,一个BindException被提高。但是,要检查 对于控制器方法中的此类错误,可以添加一个BindingResult紧接着的参数 到@ModelAttribute,如以下示例所示:spring-doc.cadn.net.cn

@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result) { (1)
	if (result.hasErrors()) {
		return "petForm";
	}
	// ...
}
1 添加一个BindingResult旁边的@ModelAttribute.
@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
fun processSubmit(@ModelAttribute("pet") pet: Pet, result: BindingResult): String { (1)
	if (result.hasErrors()) {
		return "petForm"
	}
	// ...
}
1 添加一个BindingResult旁边的@ModelAttribute.

在某些情况下,您可能希望在没有数据绑定的情况下访问模型属性。对于这样的 案例,您可以注入Model进入控制器并直接访问它,或者, 或者,将@ModelAttribute(binding=false),如以下示例所示:spring-doc.cadn.net.cn

@ModelAttribute
public AccountForm setUpForm() {
	return new AccountForm();
}

@ModelAttribute
public Account findAccount(@PathVariable String accountId) {
	return accountRepository.findOne(accountId);
}

@PostMapping("update")
public String update(@Valid AccountForm form, BindingResult result,
		@ModelAttribute(binding=false) Account account) { (1)
	// ...
}
1 设置@ModelAttribute(binding=false).
@ModelAttribute
fun setUpForm(): AccountForm {
	return AccountForm()
}

@ModelAttribute
fun findAccount(@PathVariable accountId: String): Account {
	return accountRepository.findOne(accountId)
}

@PostMapping("update")
fun update(@Valid form: AccountForm, result: BindingResult,
		   @ModelAttribute(binding = false) account: Account): String { (1)
	// ...
}
1 设置@ModelAttribute(binding=false).

您可以通过添加jakarta.validation.Valid注释或 Spring 的@Validated注解 (Bean 验证Spring 验证)。以下示例显示了如何执行此作:spring-doc.cadn.net.cn

@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
public String processSubmit(@Valid @ModelAttribute("pet") Pet pet, BindingResult result) { (1)
	if (result.hasErrors()) {
		return "petForm";
	}
	// ...
}
1 验证Pet实例。
@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
fun processSubmit(@Valid @ModelAttribute("pet") pet: Pet, result: BindingResult): String { (1)
	if (result.hasErrors()) {
		return "petForm"
	}
	// ...
}
1 验证Pet实例。

请注意,使用@ModelAttribute是可选的(例如,设置其属性)。 默认情况下,任何不是简单值类型的参数(由 BeanUtils#isSimpleProperty 确定) 并且不被任何其他参数解析器视为已注释 跟@ModelAttribute.spring-doc.cadn.net.cn

使用 GraalVM 编译为本机映像时,隐式@ModelAttribute上述支持不允许对相关数据进行适当的提前推断 绑定反射提示。因此,建议显式注释 方法 参数为@ModelAttribute用于 GraalVM 本机映像。