上文说到,SpringBoot2.x会自动装载MappingJackson2HttpMessageConverter进行消息转换。而MappingJackson2HttpMessageConverter会获取Spring容器中的ObjectMapper配置,来进行Jackson的序列化和反序列化。
注意:在SpringBoot2.x环境下,不要将自定义的ObjectMapper对象放入Spring容器!这样会将原有的ObjectMapper配置覆盖。
ObjectMapper是JSON操作的核心,Jackson的JSON操作都是在ObjectMapper中实现的。
1. SpringBoot2.x中的ObjectMapper
SpringBoot2.x默认装载了ObjectMapper到Spring容器,在yml配置文件中使用spring.jackson为前缀的配置可以修改,也可以在代码中实现Jackson2ObjectMapperBuilderCustomizer接口去修改ObjectMapper配置。
@Configuration
//注解通俗的说就是Spring工程中引用了Jackson的包 才会构建这个bean
@ConditionalOnClass(ObjectMapper.class)
public class JacksonAutoConfiguration {
//默认的feature配置
private static final Map, Boolean> FEATURE_DEFAULTS;
//SpringBoot2.x配置WRITE_DATES_AS_TIMESTAMPS=false,即Date日期不会转换为时间戳类型
static {
Map featureDefaults = new HashMap<>();
featureDefaults.put(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
FEATURE_DEFAULTS = Collections.unmodifiableMap(featureDefaults);
}
@Bean
public JsonComponentModule jsonComponentModule() {
return new JsonComponentModule();
}
@Configuration
@ConditionalOnClass(Jackson2ObjectMapperBuilder.class)
static class JacksonObjectMapperConfiguration {
@Bean
@Primary
//若自定义ObjectMapper放入Spring容器中,该配置不会生效!
@ConditionalOnMissingBean
//获取Spring容器中的Jackson2ObjectMapperBuilder 。
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
return builder.createXmlMapper(false).build();
}
}
@Configuration
@ConditionalOnClass(Jackson2ObjectMapperBuilder.class)
static class JacksonObjectMapperBuilderConfiguration {
private final ApplicationContext applicationContext;
JacksonObjectMapperBuilderConfiguration(ApplicationContext applicationContext) {
this.applicationCon