58、springboot 配置及定制Jackson的ObjectMapper,ObjectMapper 是 Jackson 来处理 Json 以及 xml 转换的一个核心 API

★ 配置ObjectMapper

ObjectMapper 是 Jackson 来处理 Json 以及 xml 转换的一个核心 API

就是用于实现 对象 与 json 、 对象 与 xml 的响应类型格式的转换

只要Spring Boot在类加载路径中检测到Jackson库(spring-boot-starter-web 里面默认就依赖了Jackson库),
就会自动配置ObjectMapper(转换XML用其子类:XmlMapper)。
Spring Boot检测到Jackson Dataformat XML库,就会自动配置XmlMapper

 ObjectMapper(父类) ---- >   XmlMapper (子类)  和 JsonMapper (子类)
 XmlMapper  :实现 对象 与 xml 之间的格式转换
 JsonMapper :实现 对象 与 json 之间的格式转换

因此程序只要对ObjectMapper进行配置,最终会影响它的子类。
ObjectMapper\XmlMapper\JsonMapper,都是Jackson的API,而不是Spring的API。


通过application.properties文件可对Jackson的ObjectMapper(其实是对其子类)进行定制,可通过如下属性进行定制:

spring.jackson.date-format:该属性指定处理字符串所用的日期时间格式。

spring.jackson.deserialization:该属性用于指定Jackson反序列化时的各种属性,
     它可指定com.fasterxml.jackson.databind.DeserializationFeature枚举列出的各枚举值对应的子属性。
spring.jackson.default-property-inclusion:指定处理字符串时是否包含默认属性,
     该属性支持always、non_null、non_absent、non_default、non_empty这几个属性值。
...


【总结】 所有有关Jackson的ObjectMapper的配置属性,都可通过spring.jackson.*开头的属性进行配置。

代码来自:56、springboot ------ RESTful服务及RESTful接口设计

★ 定制ObjectMapper(编程式的方式)

▲ 定制ObjectMapper的方式:

 - 方式1:通过自定义 Jackson2ObjectMapperBuilderCustomizer 这个定制化器 来进行定制。

 - 方式2:通过自定义Module进行定制。

 - 方式3:完全替换Spring Boot的ObjectMapper——这种方式是完全放弃Spring Boot所提供的自动配置。

▲ 方式1:Jackson2ObjectMapperBuilderCustomizer

 Spring Boot本身就是使用Jackson2ObjectMapperBuilderCustomizer执行定制的,
 Spring本身提供的Jackson2ObjectMapperBuilderCustomizer的order为0, 优先级比较高。

 为自定义Jackson2ObjectMapperBuilderCustomizer指定不同的order值,
 自定义Jackson2ObjectMapperBuilderCustomizer既可在 应用在Spring Boot内置的Jackson2ObjectMapperBuilderCustomizer之前, 也可应用在它之后。 

代码演示:

创建一个自定义的ObjectMapper类来实现 Jackson2ObjectMapperBuilderCustomizer 这个定制化器接口

定制内容就是对转成 json 格式的数据进行缩进,默认是缩进2格
在这里插入图片描述
依赖是只有这个 xml
在这里插入图片描述

测试结果:
在这里插入图片描述

▲方式2: Jackson原生方式,通过自定义Module进行定制

 Jackson本身就是使用Moddule来对ObjectMapper执行定制的。

 所有继承com.fasterxml.jackson.databind.Module基类的Bean都会被自动注册给Jackson2ObjectMapperBuilder对象

 Jackson2ObjectMapperBuilder会将它应用到所创建的所有ObjectMapper上,

 因此也可通过添加自定义Module子类Bean来定制Jackson的ObjectMapper。 

▲ 方式3:完全替换ObjectMapper

 使用@Bean定义自己的ObjectMapper、并使用@Primary注解修饰它,
 这个自定义的ObjectMapper就会代替Spring Boot自动配置的ObjectMapper。

 使用@Bean定义自己的Jackson2ObjectMapperBuilder,它会代替自动配置的Jackson2ObjectMapperBuilder,
 用自己的Builder来代替spring Boot自动配置的Builder。

 这样Spring Boot将会使用自定义的Jackson2ObjectMapperBuilder来创建ObjectMapper。

 ——无论如何,Spring Boot总是使用Jackson2ObjectMapperBuilder(自动配置|手动配置)来创建ObjectMapper。

猜你喜欢

转载自blog.csdn.net/weixin_44411039/article/details/132775765