我的主要问题是:Spring 在哪里/何时使用(注入)在项目的 @Configuration 类中定义的 Jackson2ObjectMapperBuilderCustomizer bean——你能指导我到代码行吗?这里的指示看起来我需要做的就是定义该 bean 来控制响应在 JSON 中的序列化方式,但它不起作用——即我不能禁用任何 SerializationFeatures。
一些背景:
- spring-boot 2.1.1 发布
- spring-webmvc-5.1.3.release
- 杰克逊 2.9.7
我写了一个 REST api (@RestController)。我无法自定义 Jackson 在 http 响应中序列化 Java Instant 类型的方式。我尝试了在我的配置中定义 ObjectMapper bean、MappingJackson2HttpMessageConverter bean 和 Jackson2ObjectMapperBuilderCustomizer bean 的各种组合(不是一次全部):
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return builder -> {
builder.modules(new JavaTimeModule());
builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
builder.featuresToDisable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS);
}
}
当我调试应用程序时,看起来 RequestMappinghandlerAdapter 的转换器由 WebMvcConfigurationSupport 初始化,但所有这些转换器都是手动实例化的,而不是被注入的。也就是说,所有的 MappingJackson2HttpMessageConverter 都是通过调用“new MappingJackson2HttpMessageConverter()”创建的,这反过来又简单地创建了库存的 Jackson2ObjectMapperBuilders 和 ObjectMappers:
// in org.springframework:spring-web:5.1.3.RELEASE:
public class MappingJackson2HttpMessageConverter extends AbstractJackson2HttpMessageConverter {
// ... more
public MappingJackson2HttpMessageConverter() {
this(Jackson2ObjectMapperBuilder.json().build());
}
}
public class Jackson2ObjectMapperBuilder {
public static Jackson2ObjectMapperBuilder json() {
return new Jackson2ObjectMapperBuilder();
}
}
处理响应的 HttpEntityMethodProcessor 使用相同的转换器。我找不到 Jackson2ObjectMapperBuilderCustomizer 在此生命周期中的哪个位置执行自定义。我知道我一定错过了什么,但我一直找不到。