我们知道前端传递过来的http消息,不管content-type类型是application/json、application/x-xxx-form-urllencoded,或者直接是通过url传参等等。使用springmvc,在后台可以通过@RequestParam、@RequestBody等等一些列方式来接收参数,也可以通过一些特定的注解在响应时将对象转为指定的content-type类型的数据。但是这些http消息和java格式的数据间的互转工作,是由什么来完成这项工作的呢?
主要是通过SpringMVC提供的消息转换器来完成这项工作的。通过HttpMessageConverter实现将http消息转为对象绑定到这些方法(Controller中请求的方法)的参数上,从这些方法返回的对象转换为HTTP消息。当用户发送请求后,@RequestBody注解会读取请求body中的数据,通过获取请求头Header中的Content-Type来确认请求头的数据格式,从而来为请求数据适配合适的转换器。例如contentType:applicatin/json,那么转换器会适配MappingJackson2HttpMessageConverter。响应时候的时候同理,@ResponseBody注解会通过检测请求头Header中Accept属性来适配对应响应的转换器。
默认情况下会自动注册这些MIME类型的转换器(Spring Framework Reference Documentation),但你也可以覆盖默认值并通过messageConverters() bean属性注册自定义转换器。默认转换器ByteArrayHttpMessageConverter, StringHttpMessageConverter、ResourceHttpMessageConverter、SourceHttpMessageConverter、AllEncompassingFormHttpMessageConverter(它的作用是,从类加载器去查找相关的类,只有这些转换器需要的类(jar包被你引入了)存在,那么转换器才会被加载进去,比如在类路径上存在了jackson,MappingJackson2HttpMessageConverter转换器就会被用于@RequestBody和@ResponseBody)
MappingJackson2HttpMessageConverter:
一个可以使用Jackson的objectapper读写JSON的HttpMessageConverter实现。通过使用Jackson提供的注释,可以根据需要定制JSON映射。当需要进一步控制时,可以通过objectapper属性注入自定义objectapper(也就是说可以自定义一个ObjectMapper,如图-自定义ObjectMapper所示),以应对需要为特定类型提供自定义JSON序列化器/反序列化器的情况。默认情况下,这个转换器支持(application/json)。
如何自定义消息转换器
SprignBoot中需要实现WebMvcConfigurer重写configureMessageConverters方法或者extendMessageConverters方法。
原创不易,转载请注明出处。