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。到目前为止,这是我的粗略理解:

但我对这些对象的作用和Chapter 7 of the Spring documentation: "Validation, Data Binding, and Type Conversion"中描述的对象感到困惑。 具体来说,我不明白 DataBinderBindingResult 如何与 Jackson ObjectMapper 比赛及其结果

例如,假设我有以下 @RestController 方法:

@RequestMapping(method = POST)
public MyBean postMyBean(@RequestBody @Valid MyBean myBean, BindingResult result) {
    return myBean;
}
  • 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 注释方法来说不太重要,转换器会在其中发挥作用,但它用于验证过去的转换。

  • QDataBinderBindingResult 与使用 JSR-303 正交吗?
  • A: 不,JSR-303 验证通过 DataBinder 发生,验证错误捕获到 BindingResult.