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

@ModelAttribute

你可以使用@ModelAttribute在方法参数上进行注释以访问从 如果不存在,可以建模或实例化。模型属性也叠加于 查询参数和形式字段的值,这些字段名称与字段名称相匹配。这是 称为数据绑定,它省去了处理解析和 转换单个查询参数和表单字段。以下示例绑定了宠物:spring-doc.cadn.net.cn

@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
public String processSubmit(@ModelAttribute Pet pet) { } (1)
1 绑定一个实例宠物.
@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
fun processSubmit(@ModelAttribute pet: Pet): String { } (1)
1 绑定一个实例宠物.

宠物前述例子中的实例解析如下:spring-doc.cadn.net.cn

在获得模型属性实例后,应用数据绑定。这WebExchangeDataBinder类将查询参数和表单字段的名称匹配到字段 目标上的名字对象.类型转换后填充匹配字段 必要时。关于数据绑定(及验证)的更多信息,请参见验证。关于数据绑定的自定义,请参见DataBinder.spring-doc.cadn.net.cn

数据绑定可能导致错误。默认情况下,WebExchangeBindException被提出,但, 为了检查控制器方法中的此类错误,可以添加一个绑定结果论点 紧邻@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 添加一个绑定结果.
@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
fun processSubmit(@ModelAttribute("pet") pet: Pet, result: BindingResult): String { (1)
	if (result.hasErrors()) {
		return "petForm"
	}
	// ...
}
1 添加一个绑定结果.

你可以通过添加jakarta.validation.valid注释或斯普林的注释@Validated注释(另见豆验证春季验证)。以下示例使用了@Valid注解: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 @Valid基于模型属性参数。
@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
fun processSubmit(@Valid @ModelAttribute("pet") pet: Pet, result: BindingResult): String { (1)
	if (result.hasErrors()) {
		return "petForm"
	}
	// ...
}
1 @Valid基于模型属性参数。

与 Spring MVC 不同,Spring WebFlux 支持模型中的反应类型——例如,单<账户>io.reactivex.Single<Account>.你可以声明@ModelAttribute论点 无论是否使用响应式类型封装器,都会相应地解析, 必要时调整到实际值。不过,请注意,要使用绑定结果你必须声明@ModelAttribute在没有反应的情况下进行论证 类型包装器,如前所述。或者,你可以通过以下方式处理任何错误 反应型,如下示例所示:spring-doc.cadn.net.cn

@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
public Mono<String> processSubmit(@Valid @ModelAttribute("pet") Mono<Pet> petMono) {
	return petMono
		.flatMap(pet -> {
			// ...
		})
		.onErrorResume(ex -> {
			// ...
		});
}
@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
fun processSubmit(@Valid @ModelAttribute("pet") petMono: Mono<Pet>): Mono<String> {
	return petMono
			.flatMap { pet ->
				// ...
			}
			.onErrorResume{ ex ->
				// ...
			}
}

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

当用 GraalVM 编译到原生镜像时,隐式的@ModelAttribute上述支持无法提前正确推断相关数据 有约束力的反思提示。因此,建议明确注释 方法参数@ModelAttribute用于GraalVM原生镜像。