首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不建议使用ObjectMapper启用方法

不建议使用ObjectMapper启用方法
EN

Stack Overflow用户
提问于 2022-01-06 07:59:36
回答 2查看 8.8K关注 0票数 10

我正在升级我的项目的版本,我目前正在使用jackson-databind-2.13.0 .But,我注意到ObjectMapper的enable方法是不推荐的。

他们说要这样用。

代码语言:javascript
运行
复制
@deprecated Since 2.13 use {@code JsonMapper.builder().enable(...)}

但我不能用它。

下面是我的ObjectMapper实例创建代码。我怎么能改变呢?

代码语言:javascript
运行
复制
      @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;

}

解决方案:

代码语言:javascript
运行
复制
    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();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-06 09:48:02

我建议重写你的代码

jacksonObjectMapper)

  • Use

  • 移除此bean并使用已配置的完全Spring ObjectMapper (名称为Jackson2ObjectMapperBuilder )来创建ObjectMapper.实例

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

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

代码语言:javascript
运行
复制
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方法。

代码语言:javascript
运行
复制
@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

代码语言:javascript
运行
复制
@Bean(name = {"objectMapper"})
@Primary
ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
    return newObjectMapper(builder);
}

public static ObjectMapper newObjectMapper(Jackson2ObjectMapperBuilder builder) {
   return builder.build();
}
票数 11
EN

Stack Overflow用户

发布于 2022-05-18 15:53:53

在通过MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS启用Enum不区分大小写反序列化时,我遇到了类似的问题。

在我的例子中,由于ObjectMapper以前是由外部源构建的,所以无法切换到构建器方法。因此,唯一的选择是直接修改ObjectMapper反序列化配置。寻找替代方案以避免被废弃的API objectMapper.enable(MappedFeature... f)我找到了一个解决办法.

通过setter方法调用配置的instance.

  • Creating上的with(MapperFeature... features) --与新配置的ObjectMapper原始配置--从ObjectMapper

  • 获取原始配置的“副本”,并启用MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS

这也适用于SerializationConfig,它是一种在已经构造的ObjectMapper上修改配置而不使用不推荐的API的一种方法。

代码语言:javascript
运行
复制
public void customizeMapper(ObjectMapper objectMapper) {
    final DeserializationConfig originalConfig = objectMapper.getDeserializationConfig();

    final DeserializationConfig newConfig = originalConfig.with(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS);

    objectMapper.setConfig(newConfig);
}

注意:使用杰克逊的构建器的绝对是一个更好的解决方案。只有在不可能使用生成器的情况下,才考虑使用这种方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70604058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档