0

我的主要问题是: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 在此生命周期中的哪个位置执行自定义。我知道我一定错过了什么,但我一直找不到。

4

1 回答 1

1
@Bean
@Primary
public ObjectMapper customMapper(){
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    mapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false);
    return mapper;
}

将上述 bean 定义放入您的配置中。这将使 spring 使用这个自定义 bean 而不是默认的。

于 2020-03-04T06:01:15.677 回答