将ObjectMapper迁移到JsonMapper

后端开发 2026-07-10

我现在正在将我的应用升级到 Jackson 3.x(以及Spring Boot 4.0)。在Jackson 2中,我已有一个现成的 ObjectMapper bean,它手动配置 JavaTimeModule,使用了特定的 DateTimeFormatter 模式以及若干功能开关。

在Jackson 3中,我注意到 ObjectMapper 现在是不可变的,遵循构建器模式,包名也从 com.fasterxml.jackson 变为 tools.jackson。另外,JavaTimeModule(jsr310)似乎已默认集成。

@Bean
public ObjectMapper objectMapper() {
  JavaTimeModule module = new JavaTimeModule();
  ObjectMapper mapper = new ObjectMapper();

  module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ISO_DATE_TIME));
  module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ISO_DATE_TIME));
  module.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ISO_DATE));
  module.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ISO_DATE));

  mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  mapper.configure(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN, true);
  mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
  mapper.registerModule(module);

  mapper.setSerializationInclusion(Include.NON_NULL);
  return mapper;
}

如何使用新的Jackson 3 Builder API重建这个特定的配置(尤其是LocalDateTime和 LocalDate的自定义DateTimeFormatter)?我还能否向“内置”的时间支持添加自定义序列化/反序列化器,还是应该继续注册一个模块?

解决方案

起点是 JsonMapper.builder()JsonMapper.builderWithJackson2Defaults(),取决于你是想完全兼容还是想接受新的默认设置。

从那里我们可以按需添加内容。先从模块开始。现在不再有 JavaTimeModule,因此改用 SimpleModule 了。你可以像往常一样向其中添加序列化器和反序列化器。构建器提供 addModule 方法来添加模块。

对特性的配置可以在构建器上通过任意的 configure 方法来完成。

至于包含策略,这部分有点棘手但一旦你知道要使用 changeDefaultPropertyInclusion,就可以实现。

结果:

SimpleModule module = new SimpleModule();
module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ISO_DATE_TIME));
module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ISO_DATE_TIME));
module.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ISO_DATE));
module.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ISO_DATE));

return JsonMapper.builder()
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
        .configure(StreamWriteFeature WRITE_BIGDECIMAL_AS_PLAIN, true)
        .configure(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS, false)
        .addModule(module)
        .changeDefaultPropertyInclusion(inclusion -> inclusion.withValueInclusion(Include.NON_NULL))
        .build();
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章