SpringMVC中bean反序列化和validation涉及的对象是什么关系?
In Spring MVC, what is the relationship between the objects involved in bean deserialization and validation?
我正在通过 Spring Boot 1.2 使用 Spring MVC,并试图了解如何将请求主体绑定到容器中的域模型 bean。到目前为止,这是我的粗略理解:
RequestMappingHandlerMapping
采用我的 @Controller
的 @RequestMapping
注释方法,并使它们可用于到达 DispatchServlet
. 的请求
- 根据方法的参数类型和注释,
RequestMappingHandlerAdapter
负责将必要的参数注入这些方法。
-
RequestMappingHandlerAdapter
配备了一个 RequestResponseBodyMethodProcessor
来处理处理请求和响应主体,后者又具有 MappingJackson2HttpMessageConverter
,后者又具有 Jackson ObjectBinder
对我的域对象执行实际的 deserialization/serialization。
但我对这些对象的作用和Chapter 7 of the Spring documentation: "Validation, Data Binding, and Type Conversion"中描述的对象感到困惑。 具体来说,我不明白 DataBinder
和 BindingResult
如何与 Jackson ObjectMapper
比赛及其结果。
例如,假设我有以下 @RestController
方法:
@RequestMapping(method = POST)
public MyBean postMyBean(@RequestBody @Valid MyBean myBean, BindingResult result) {
return myBean;
}
- 因为
@RequestBody
,MappingJackson2HttpMessageConverter
用于将请求体变成MyBean
对象。如果由于 JSON 字符串中的未知字段而失败,BindingResult
是否会有此信息?
- 什么数据绑定过程,如果不是 JSON->Bean 数据绑定,用
BindingResult
报告?
DataBinder
如何影响所有这些?
DataBinder
和 BindingResult
与使用 JSR-303 正交吗?
- Q:因为
@RequestBody
,所以用MappingJackson2HttpMessageConverter
把request body变成MyBean对象。如果由于 JSON 字符串中的未知字段而失败,BindingResult
是否会有此信息?
- A: 不,如果转换器抛出异常,它将作为 4xx 错误传播回用户。首先使用转换器转换 JSON,然后使用 binder/validator 验证转换后的 bean。
- Q: 什么数据绑定过程,如果不是JSON->Bean数据绑定,用
BindingResult
报告?
- A:
BindingResult
保存验证结果。如果您使用 @Valid
注释了您的 bean,然后将 BindingResult
作为方法参数,那么将使用基于 JSR 303 的验证器或使用您可能已注册的 bean 的任何自定义验证器来验证该 bean .
- Q:DataBinder 如何影响所有这些?
- A: Databinder 用于绑定和验证 bean(以及注册绑定器和验证器)。对于绑定
@RequestBody
注释方法来说不太重要,转换器会在其中发挥作用,但它用于验证过去的转换。
- Q:
DataBinder
和 BindingResult
与使用 JSR-303 正交吗?
- A: 不,JSR-303 验证通过
DataBinder
发生,验证错误捕获到 BindingResult
.
我正在通过 Spring Boot 1.2 使用 Spring MVC,并试图了解如何将请求主体绑定到容器中的域模型 bean。到目前为止,这是我的粗略理解:
RequestMappingHandlerMapping
采用我的@Controller
的@RequestMapping
注释方法,并使它们可用于到达DispatchServlet
. 的请求
- 根据方法的参数类型和注释,
RequestMappingHandlerAdapter
负责将必要的参数注入这些方法。 -
RequestMappingHandlerAdapter
配备了一个RequestResponseBodyMethodProcessor
来处理处理请求和响应主体,后者又具有MappingJackson2HttpMessageConverter
,后者又具有 JacksonObjectBinder
对我的域对象执行实际的 deserialization/serialization。
但我对这些对象的作用和Chapter 7 of the Spring documentation: "Validation, Data Binding, and Type Conversion"中描述的对象感到困惑。 具体来说,我不明白 DataBinder
和 BindingResult
如何与 Jackson ObjectMapper
比赛及其结果。
例如,假设我有以下 @RestController
方法:
@RequestMapping(method = POST)
public MyBean postMyBean(@RequestBody @Valid MyBean myBean, BindingResult result) {
return myBean;
}
- 因为
@RequestBody
,MappingJackson2HttpMessageConverter
用于将请求体变成MyBean
对象。如果由于 JSON 字符串中的未知字段而失败,BindingResult
是否会有此信息? - 什么数据绑定过程,如果不是 JSON->Bean 数据绑定,用
BindingResult
报告? DataBinder
如何影响所有这些?DataBinder
和BindingResult
与使用 JSR-303 正交吗?
- Q:因为
@RequestBody
,所以用MappingJackson2HttpMessageConverter
把request body变成MyBean对象。如果由于 JSON 字符串中的未知字段而失败,BindingResult
是否会有此信息? - A: 不,如果转换器抛出异常,它将作为 4xx 错误传播回用户。首先使用转换器转换 JSON,然后使用 binder/validator 验证转换后的 bean。
- Q: 什么数据绑定过程,如果不是JSON->Bean数据绑定,用
BindingResult
报告? - A:
BindingResult
保存验证结果。如果您使用@Valid
注释了您的 bean,然后将BindingResult
作为方法参数,那么将使用基于 JSR 303 的验证器或使用您可能已注册的 bean 的任何自定义验证器来验证该 bean .
- Q:DataBinder 如何影响所有这些?
- A: Databinder 用于绑定和验证 bean(以及注册绑定器和验证器)。对于绑定
@RequestBody
注释方法来说不太重要,转换器会在其中发挥作用,但它用于验证过去的转换。
- Q:
DataBinder
和BindingResult
与使用 JSR-303 正交吗? - A: 不,JSR-303 验证通过
DataBinder
发生,验证错误捕获到BindingResult
.