|
对于最新稳定版本,请使用Spring Framework 7.0.1! |
@ModelAttribute
你可以使用@ModelAttribute在方法参数上进行注释以访问从
如果不存在,可以建模或实例化。模型属性也叠加于
查询参数和形式字段的值,这些字段名称与字段名称相匹配。这是
称为数据绑定,它省去了处理解析和
转换单个查询参数和表单字段。以下示例绑定了宠物:
-
Java
-
Kotlin
@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 | 绑定一个实例宠物. |
这宠物前述例子中的实例解析如下:
-
如果已经通过模型添加
型. -
从HTTP会话到
@SessionAttributes. -
从调用默认构造函数时获得。
-
从调用“主构造子”并引用与查询匹配的参数 参数或表单字段。参数名称通过 JavaBeans 确定
@ConstructorProperties或者通过字节码中保留的运行时参数名称。
在获得模型属性实例后,应用数据绑定。这WebExchangeDataBinder类将查询参数和表单字段的名称匹配到字段
目标上的名字对象.类型转换后填充匹配字段
必要时。关于数据绑定(及验证)的更多信息,请参见验证。关于数据绑定的自定义,请参见DataBinder.
数据绑定可能导致错误。默认情况下,WebExchangeBindException被提出,但,
为了检查控制器方法中的此类错误,可以添加一个绑定结果论点
紧邻@ModelAttribute,如下示例所示:
-
Java
-
Kotlin
@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 | 添加一个绑定结果. |
-
Java
-
Kotlin
@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在没有反应的情况下进行论证
类型包装器,如前所述。或者,你可以通过以下方式处理任何错误
反应型,如下示例所示:
-
Java
-
Kotlin
@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.
当用 GraalVM 编译到原生镜像时,隐式的@ModelAttribute上述支持无法提前正确推断相关数据
有约束力的反思提示。因此,建议明确注释
方法参数@ModelAttribute用于GraalVM原生镜像。 |