在Spring MVC中,bean反序列化和验证中涉及的对象之间的关系是什么?

时间:2015-01-16 15:59:30

标签: java spring spring-mvc spring-boot

我通过Spring Boot 1.2使用Spring MVC并试图了解请求主体如何绑定到容器中的域模型bean。到目前为止,我的理解是:

  • RequestMappingHandlerMapping使用@RequestMapping - @Controller的带注释的方法,并将其用于到达DispatchServlet的请求。
  • 取决于方法'参数类型和注释,RequestMappingHandlerAdapter处理将必要的参数注入这些方法。
  • RequestMappingHandlerAdapter配备了RequestResponseBodyMethodProcessor来处理处理请求和响应正文,而处理请求和响应正文又拥有MappingJackson2HttpMessageConverter,而ObjectBinder依次拥有执行该处理请求的杰克逊DataBinder我的域对象的实际反序列化/序列化。

但我对这些对象的角色以及Chapter 7 of the Spring documentation: "Validation, Data Binding, and Type Conversion"中描述的对象感到困惑。 具体而言,我并不完全了解BindingResultObjectMapper如何与杰克逊@RestController及其结果进行对比。

例如,假设我有以下@RequestMapping(method = POST) public MyBean postMyBean(@RequestBody @Valid MyBean myBean, BindingResult result) { return myBean; } 方法:

@RequestBody
  • 由于MappingJackson2HttpMessageConverterMyBean用于将请求正文转换为BindingResult个对象。如果由于JSON字符串中的未知字段而失败,BindingResult是否会收到此信息?
  • 使用DataBinder报告哪些数据绑定过程(如果不是JSON-> Bean数据绑定)?
  • DataBinder如何影响所有这些?
  • BindingResult和{{1}}是否与使用JSR-303正交?

1 个答案:

答案 0 :(得分:2)

  • :由于@RequestBodyMappingJackson2HttpMessageConverter用于将请求正文变为MyBean对象。如果由于JSON字符串中的未知字段而失败,BindingResult是否会收到此信息?
  • A:不,如果转换器抛出异常,它将作为4xx错误传回给用户。首先使用转换器转换JSON,然后使用binder / validator验证转换后的bean。

  • :使用BindingResult报告哪些数据绑定过程(如果不是JSON-> Bean数据绑定)?
  • A BindingResult包含验证结果。如果您使用@Valid注释了bean,然后使用BindingResult作为方法参数,那么将使用基于JSR 303的验证程序或使用您可能已注册的bean的任何自定义验证程序验证该bean

  • :DataBinder如何影响所有这些?
  • A: Databinder用于绑定和验证bean(以及用于注册绑定器和验证器)。对于绑定@RequestBody带注释的方法来说,它不那么重要,转换器会起作用,但它用于验证过去的转换。

  • DataBinderBindingResult是否与使用JSR-303正交?
  • 答:否,JSR-303验证通过DataBinder进行,验证错误被捕获到BindingResult