【问题标题】:ObjectMapper enable method is deprecated不推荐使用 ObjectMapper 启用方法
【发布时间】:2022-01-06 07:59:36
【问题描述】:

我正在升级我的项目的版本,我目前正在使用 jackson-databind-2.13.0 .但我注意到 ObjectMapper 的 enable 方法已被弃用。

他们说要这样使用它。

@deprecated Since 2.13 use {@code JsonMapper.builder().enable(...)}

但我无法使用它。

下面是我的 ObjectMapper 实例创建代码。我该如何改变?

      @Bean(name = {"objectMapper"})
      @Primary
      ObjectMapper objectMapper() {
        return newObjectMapper();
      }

  public static ObjectMapper newObjectMapper() {
    ObjectMapper objectMapper =
        new ObjectMapper()
            .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
            .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
            .configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true)
            .setSerializationInclusion(JsonInclude.Include.NON_NULL)
            .enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(OffsetDateTime.class, new OffsetDateTimeSerializer());
javaTimeModule.addDeserializer(OffsetDateTime.class, new OffsetDateTimeDeserializer());
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer());
javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer());
objectMapper
    .registerModule(javaTimeModule)
    .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

return objectMapper;

}

解决方案:

    ObjectMapper objectMapper = JsonMapper
    .builder()
    .enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES)
    .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
    .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
    .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
    .configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true)
    .serializationInclusion(Include.NON_NULL).build();

【问题讨论】:

  • 为什么不能用?你收到错误了吗?结果出乎意料吗?弃用评论更清楚地指出 new ObjectMapper().enable(…) 应转换为 JsonMapper.builder().enable(…).build()
  • 你为什么不使用 Spring Boot 配置的实例,让 Spring Boot 配置它(并且你提供一些属性来配置它?
  • 被弃用并不意味着你不能使用它,这意味着你不应该使用它。如:是的,您现在仍然可以使用它,但是您应该在从新(er)版本的库中删除该方法之前重构您的代码
  • 我实际使用它,我没有收到任何错误。我只是想改变。
  • 你用的是什么?这个方法还是Spring Boot配置的一个(因为你不是自己配置的)。

标签: java spring spring-boot objectmapper jackson-databind


【解决方案1】:

我建议将您的代码重写为任一

  1. 删除此 bean 并使用完全配置的 Spring Boot ObjectMapper(名称为 jacksonObjectMapper
  2. 使用Jackson2ObjectMapperBuilder 创建ObjectMapper 的实例。

所有这些解决方案都隐藏了构建 ObjectMapper 的复杂部分,并且还将(正确地)将构建它的负担交给 Spring Boot 团队,而不是您。

现在对于选项 1,您需要删除您的 @Bean 并将以下内容放入您的 application.properties

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false

spring.jackson.deserialization.FAIL_ON_UNKNOWN_PROPERTIES=false
spring.jackson.deserialization.ACCEPT_SINGLE_VALUE_AS_ARRAY=true

spring.jackson.mapper.ACCEPT_CASE_INSENSITIVE_PROPERTIES=true

spring.jackson.defaultPropertyInclusion=NON_NULL

当 Spring (Boot) 在类路径中检测到 JavaTime 模块时,它将自动注册到 ObjectMapper,因此无需额外添加该模块(或相关的序列化程序)。

这些配置行应该与您显式配置的ObjectMapper 相同。 H

对于第二个选项,您可以通过使用参数将Jackson2ObjectMapperBuilder 注入方法中,在那里配置您想要的东西,最后调用build 方法。

@Bean(name = {"objectMapper"})
@Primary
ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
    return newObjectMapper(builder);
}

public static ObjectMapper newObjectMapper(Jackson2ObjectMapperBuilder builder) {
   return builder
            .serializationInclusion(NON_NULL)
            .failOnEmptyBeans(false)
            .failOnUnknownProperties(false)
           .featuresToEnable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
           .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.build();

您仍然不需要注册 JavaTime 模块,因为它仍然会为您自动检测。

理论上您可以将 1 和 2 结合起来,但在您的情况下不会增加太多,只需一些代码来构造 ObjectMapper

@Bean(name = {"objectMapper"})
@Primary
ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
    return newObjectMapper(builder);
}

public static ObjectMapper newObjectMapper(Jackson2ObjectMapperBuilder builder) {
   return builder.build();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 2014-05-05
    • 2012-02-22
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多