Jackson提供了XML和JSON序列化和反序列化的工具包。在SpringBoot项目中我们常常使用ObjectMapper进行Java对象和JSON之间的转换。
其次,我们考虑一下,我们通过Postman传json格式请求体调用我们自己的接口时,我们可以直接定义一个Java对象接收,这里SpringBoot一定是帮我们做了由Json转Java对象的操作的。这件事情是谁完成的呢?

ObjectMapper粗解

正常情况下我们在SpringBoot的Web类项目中,想使用ObjectMapper,只需要通过以下方式依赖ObjectMapper即可

  1. @Autowired
  2. private ObjectMapper objectMapper;

思考:

  1. ObjectMapper我们自己没有注入Spring容器,那为什么可以依赖?
  2. 我们想要自定义这个注入容器中的ObjectMapper的话要怎么做?

自动配置

这里回答第一个思考问题:ObjectMapper我们自己没有注入Spring容器,那为什么可以依赖?
答案:SpringBoot通过JacksonAutoConfiguration对ObjectMapper进行自动配置。
JacksonAutoConfiguration这个自动配置类目前我理解的作用有如下几个:

  1. 将ObjectMapper注入到Spring容器中
  2. 对ObjectMapper进行默认的配置,用户可以通过spring.jackson进行配置ObjectMapper行为

    自定义全局ObjectMapper

    这里回答第二个思考问题:我们想要自定义这个注入容器中的ObjectMapper的话要怎么做?
    答案:通过自定义Jackson2ObjectMapperBuilderCustomizer并注入到容器中即可
    1. @Bean
    2. public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
    3. return builder -> {
    4. builder.simpleDateFormat("yyyy-MM-dd");
    5. builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
    6. builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
    7. };
    8. }

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。

总结

  1. MappingJackson2HttpMessageConverter负责我们请求和响应的JSON数据转换工作,MappingJackson2HttpMessageConverter内是通过ObjectMapper完成的
  2. ObjectMapper类SpringBoot默认注入容器,进行默认的配置。可以通过application.ymlspring.jackson属性进行修改,也可以自定义Jackson2ObjectMapperBuilderCustomizer的Bean对全局ObjectMapper进行配置