Java 在SpringMVC中,bean反序列化和验证所涉及的对象之间的关系是什么?
我正在通过SpringBoot1.2使用SpringMVC,并试图了解如何将请求主体绑定到容器中的域模型bean。以下是我到目前为止的大致理解:Java 在SpringMVC中,bean反序列化和验证所涉及的对象之间的关系是什么?,java,spring,spring-mvc,spring-boot,Java,Spring,Spring Mvc,Spring Boot,我正在通过SpringBoot1.2使用SpringMVC,并试图了解如何将请求主体绑定到容器中的域模型bean。以下是我到目前为止的大致理解: RequestMappingHandlerMapping接受我的@Controller的@RequestMapping注释方法,并使它们可用于到达DispatchServlet的请求 根据方法的参数类型和注释,RequestMappingHandlerAdapter处理向这些方法中注入必要的参数 RequestMappingHandlerAdapte
接受我的RequestMappingHandlerMapping
的@Controller
注释方法,并使它们可用于到达@RequestMapping
的请求DispatchServlet
- 根据方法的参数类型和注释,
处理向这些方法中注入必要的参数RequestMappingHandlerAdapter
配备了一个RequestMappingHandlerAdapter
来处理请求和响应主体,它又有RequestResponseBodyMethodProcessor
,它又有JacksonMappingJackson2HttpMessageConverter
,执行与我的域对象之间的实际反序列化/序列化ObjectBinder
DataBinder
和BindingResult
是如何与JacksonObjectMapper及其结果进行交互的
例如,假设我有以下@RestController
方法:
@RequestMapping(method = POST)
public MyBean postMyBean(@RequestBody @Valid MyBean myBean, BindingResult result) {
return myBean;
}
- 由于
@RequestBody
,映射jackson2httpmessageconverter
用于将请求主体转换为MyBean
对象。如果由于JSON字符串中的未知字段而失败,BindingResult
是否会包含此信息
- 如果不是JSON->Bean数据绑定,那么使用
BindingResult
报告什么数据绑定过程李>
DataBinder
是如何考虑到这一切的李>
DataBinder
和BindingResult
是否与使用JSR-303正交
- Q:由于
@RequestBody
,映射jackson2httpmessageconverter
用于将请求主体转换为MyBean对象。如果由于JSON字符串中的未知字段而失败,BindingResult
是否会包含此信息
- A:否,如果转换器抛出异常,该异常将作为4xx错误传播回用户。首先使用转换器转换JSON,然后使用绑定器/验证器验证转换后的bean
- Q:如果不是JSON->Bean数据绑定,那么将使用
BindingResult
报告什么数据绑定过程
- A:
BindingResult
保存验证结果。如果您使用@Valid
注释bean,然后使用BindingResult
作为方法参数,那么将使用基于JSR303的验证器或您可能已注册的bean的任何自定义验证器对bean进行验证
- Q:DataBinder是如何融入所有这些因素的
- A:Databinder用于绑定和验证bean(以及注册绑定器和验证器)。对于绑定
@RequestBody
带注释的方法来说,它不太重要,因为转换器起作用,但它用于验证过去的转换
- Q:使用JSR-303时,
DataBinder
和BindingResult
是否正交
- A:否,JSR-303验证通过
DataBinder
进行,验证错误捕获到BindingResult
中
在以下位置找到此项:“可以用
@Valid
注释@RequestBody
方法参数,在这种情况下,将使用配置的验证器实例对其进行验证。”。当使用MVC名称空间或MVC Java配置时,假设类路径上有JSR-303实现,则会自动配置JSR-303验证器。“谢谢。因此,就与@RequestBody
的绑定而言,Converter
s和DataBinder
是正交的,因为DataBinder
只执行验证,而绑定发生在转换器中,这是一个公平点-转换器和数据绑定器可以被认为是正交的,特别是对于@RequestBody
情况