首页 > 解决方案 > 是否有任何选项可以在 Spring Boot 中使用 Jackson 为 java.time.* 包注册一次 Serializer/Deserializer?

问题描述

你好团队,

我正在开发一个 Spring Boot 项目(版本 2.3.4 版本),其中我使用 java.time.LocalDate、java.time.LocalDateTime 和 java.time.LocalTime 数据类型来处理几个 bean 中的一些属性。

但是,这些字段不会自动反序列化,除非我明确地向它们提供以下注释以及我的自定义反序列化程序。

@JsonFormat(pattern="dd-MMM-yyyy")
@JsonDeserialize(using= LocalDateWithStringsDeserializer.class)
private LocalDate date_of_joining;

将这些注释添加到所有 bean 中确实是一项耗时的工作,因为该项目中有超过 400-500 个 bean。

如果未提供这些注释,则会出现以下错误。

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.LocalDate` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('27-May-1999')

我还尝试定义一个显式 Bean 以使用我的自定义反序列化器覆盖 Spring Boot objectmapper,但这甚至没有帮助我。下面提到了相同的代码片段。

@Bean
@Primary
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
    ObjectMapper objectMapper = builder.build();
    objectMapper.findAndRegisterModules();
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    objectMapper.setDateFormat(dateformat);
    SimpleModule module = new SimpleModule();
    module.addDeserializer(LocalDateTime.class, new MillisOrLocalDateTimeDeserializer());
    module.addDeserializer(LocalDate.class, new LocalDateWithStringsDeserializer());
    module.addDeserializer(LocalTime.class, new LocalTimeWithStringDeserializer());
    objectMapper.registerModule(module);
    return objectMapper;
}

我什至在项目中的 pom.xml 文件中添加了以下依赖项。

    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-parameter-names</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jdk8</artifactId>
    </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
    </dependency>

请提出解决方案。

标签: javaspring-bootjacksonjson-deserializationjava-time

解决方案


所以我想出了解决方案。之前配置的其他一些对象映射器在项目中使用 Joda Time,这些对象映射器作为必需库添加到我的项目的构建路径中。

修改现有的对象映射器并在该项目中为日期和时间注册 Java 时间模块和自定义反序列化器,就像我在这个问题中提到的那样解决了这个问题。


推荐阅读