SpringBoot 配置及定制 Jackson 的 ObjectMapper
配置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。