Jackson提供了XML和JSON序列化和反序列化的工具包。在SpringBoot项目中我们常常使用ObjectMapper
进行Java对象和JSON之间的转换。
其次,我们考虑一下,我们通过Postman传json格式请求体调用我们自己的接口时,我们可以直接定义一个Java对象接收,这里SpringBoot一定是帮我们做了由Json转Java对象的操作的。这件事情是谁完成的呢?
ObjectMapper粗解
正常情况下我们在SpringBoot的Web类项目中,想使用ObjectMapper,只需要通过以下方式依赖ObjectMapper
即可
@Autowired
private ObjectMapper objectMapper;
思考:
- ObjectMapper我们自己没有注入Spring容器,那为什么可以依赖?
- 我们想要自定义这个注入容器中的ObjectMapper的话要怎么做?
自动配置
这里回答第一个思考问题:ObjectMapper我们自己没有注入Spring容器,那为什么可以依赖?
答案:SpringBoot通过JacksonAutoConfiguration
对ObjectMapper进行自动配置。JacksonAutoConfiguration
这个自动配置类目前我理解的作用有如下几个:
- 将ObjectMapper注入到Spring容器中
- 对ObjectMapper进行默认的配置,用户可以通过
spring.jackson
进行配置ObjectMapper行为自定义全局ObjectMapper
这里回答第二个思考问题:我们想要自定义这个注入容器中的ObjectMapper的话要怎么做?
答案:通过自定义Jackson2ObjectMapperBuilderCustomizer
并注入到容器中即可@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
return builder -> {
builder.simpleDateFormat("yyyy-MM-dd");
builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
};
}
HttpMessageConverter
HttpMessageConverter是Spring框架提供的一个消息转换器模型,用于在 HTTP 请求和响应之间进行转换的策略接口。它可以对输入消息HttpInputMessage进行读;也可以对输出消息HttpOutputMessage进行写。
于是,若想JSON自动转Java对象,Java对象自动序列化为Json,必然需要一个HttpMessageConverter的实现来做这件事,这个实现便是:MappingJackson2HttpMessageConverter
MappingJackson2HttpMessageConverter
这个转换器就负责完成Java对象返回序列化为HttpServletResponse中的JSON响应体,以及将HttpServletRequest中的请求体JSON反序列化为Java对象。
所有的HttpMessageConverter,自定义的、MappingJackson2HttpMessageConverter
或者其他Converter需要有人配置,SpringBoot默认提供的HttpMessageConverter一定同时提供了自动配置。自定义的HttpMessageConverter就需要自己去配置。MappingJackson2HttpMessageConverter
是SpringBoot的提供的,所以提供了自动配置JacksonHttpMessageConvertersConfiguration
MappingJackson2HttpMessageConverter
需要JSON转换,于是就用到了ObjectMapper。
总结
MappingJackson2HttpMessageConverter
负责我们请求和响应的JSON数据转换工作,MappingJackson2HttpMessageConverter
内是通过ObjectMapper完成的- ObjectMapper类SpringBoot默认注入容器,进行默认的配置。可以通过
application.yml
的spring.jackson
属性进行修改,也可以自定义Jackson2ObjectMapperBuilderCustomizer
的Bean对全局ObjectMapper进行配置