🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 71.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`,默认是禁用的 Spring Boot也有一些用于简化自定义该行为的特性。 你可以使用当前的environment配置`ObjectMapper`和`XmlMapper`实例。Jackson提供一个扩展套件,可以用来关闭或开启一些特性,你可以用它们配置Jackson以处理不同方面。这些特性在Jackson中是使用6个枚举进行描述的,并被映射到environment的属性上: | Jackson枚举 | Environment属性 | | | | | | :--- | :--- | :--- | :--- | :--- | :--- | | `com.fasterxml.jackson.databind.DeserializationFeature` | \`spring.jackson.deserialization.=true | false\` | | | | | `com.fasterxml.jackson.core.JsonGenerator.Feature` | \`spring.jackson.generator.=true | false\` | | | | | `com.fasterxml.jackson.databind.MapperFeature` | \`spring.jackson.mapper.=true | false\` | | | | | `com.fasterxml.jackson.core.JsonParser.Feature` | \`spring.jackson.parser.=true | false\` | | | | | `com.fasterxml.jackson.databind.SerializationFeature` | \`spring.jackson.serialization.=true | false\` | | | | | `com.fasterxml.jackson.annotation.JsonInclude.Include` | \`spring.jackson.serialization-inclusion=always | non\_null | non\_absent | non\_default | non\_empty\` | 例如,设置`spring.jackson.serialization.indent_output=true`可以美化打印输出(pretty print)。注意,由于[松散绑定](https://github.com/cwiki-us-spring-guides/Spring-Boot-Reference-Guide/tree/0047aa8098a650dde0c93f4d2e91754c83468c4b/IV.%20Spring%20Boot%20features/24.7.2.%20Relaxed%20binding.md)的使用,`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)。具体详情可参考[Section 71.4, “Customize the @ResponseBody rendering”](https://github.com/cwiki-us-spring-guides/Spring-Boot-Reference-Guide/tree/0047aa8098a650dde0c93f4d2e91754c83468c4b/IX.%20‘How-to’%20guides/71.4%20Customize%20the%20@ResponseBody%20rendering.md)及[WebMvcAutoConfiguration](https://github.com/spring-projects/spring-boot/tree/v1.4.1.RELEASE/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration.java)源码。