76.3 自定义Jackson ObjectMapper
在一个HTTP交互中,Spring MVC(客户端和服务端)使用HttpMessageConverters
协商内容转换。如果classpath下存在Jackson,你就获取到Jackson2ObjectMapperBuilder
提供的默认转换器,这是Spring Boot为你自动配置的实例。
创建的ObjectMapper
(或用于Jackson XML转换的XmlMapper
)实例默认有以下自定义属性:
MapperFeature.DEFAULT_VIEW_INCLUSION
,默认是禁用的DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
,默认是禁用的SerializationFeature.WRITE_DATES_AS_TIMESTAMPS
,默认是禁用的
Spring Boot也有一些用于简化自定义该行为的特性。
你可以使用当前的environment配置ObjectMapper
和XmlMapper
实例。Jackson提供一个扩展套件,可以用来关闭或开启一些特性,你可以用它们配置Jackson以处理不同方面。这些特性在Jackson中是使用6个枚举进行描述的,并被映射到environment的属性上:
Jackson枚举 | Environment属性 | ||||
| `spring.jackson.deserialization.=true | false` | |||
| `spring.jackson.generator.=true | false` | |||
| `spring.jackson.mapper.=true | false` | |||
| `spring.jackson.parser.=true | false` | |||
| `spring.jackson.serialization.=true | false` | |||
| `spring.jackson.serialization-inclusion=always | non_null | non_absent | non_default | non_empty` |
例如,设置spring.jackson.serialization.indent_output=true
可以美化打印输出(pretty print)。注意,由于松散绑定的使用,indent_output
不必匹配对应的枚举常量INDENT_OUTPUT
。
基于environment的配置会应用到自动配置的Jackson2ObjectMapperBuilder
bean,然后应用到通过该builder创建的mappers,包括自动配置的ObjectMapper
bean。
ApplicationContext
中的Jackson2ObjectMapperBuilder
可以通过Jackson2ObjectMapperBuilderCustomizer
bean自定义。这些customizer beans可以排序(Spring Boot自己的customizer序号为0)。其他自定义可以应用到Spring Boot自定义之前或之后。
所有类型为com.fasterxml.jackson.databind.Module
的beans都会自动注册到自动配置的Jackson2ObjectMapperBuilder
,并应用到它创建的任何ObjectMapper
实例。这提供了一种全局机制,用于在为应用添加新特性时贡献自定义模块。
如果想完全替换默认的ObjectMapper
,你既可以定义该类型的@Bean
并注解@Primary
,也可以定义Jackson2ObjectMapperBuilder
@Bean
,通过builder构建。注意不管哪种方式都会禁用所有的自动配置ObjectMapper
。
如果你提供MappingJackson2HttpMessageConverter
类型的@Bean
,它们将替换MVC配置中的默认值。Spring Boot也提供了一个HttpMessageConverters
类型的便利bean(如果你使用MVC默认配置,那它就总是可用的),它提供了一些有用的方法来获取默认和用户增强的消息转换器(message converters)。具体详情可参考76.4 自定义@ResponseBody渲染及WebMvcAutoConfiguration源码。
最后更新于