当前位置: 首页 > 知识库问答 >
问题:

是否可以选择只为java.time注册一次序列化器/反序列化器。*在Spring Boot中使用Jackson的软件包?

闾丘霖
2023-03-14

你好,团队,

我正在开发一个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对象映射器,但这甚至没有帮助我。下面提到了相同的代码片段。

@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>

请提出解决方案。

共有1个答案

宁浩博
2023-03-14

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

修改现有的对象映射器并为Date注册Java时间模块和自定义反序列化器

 类似资料:
  • 我有一个包含映射属性的json字符串,如 当Jackson将其反序列化到包含an属性的类中时,它似乎执行了。而在序列化时,它将把对象序列化为相同的格式。 是否有一种方法让jackson正确反序列化到一个只有注解的映射中,或者我需要做一个自定义序列化器。 带有getter/setter的示例对象:

  • I'va是一个OID接口,可以由许多具体类型实现: 现在我有一个具有两个字段的对象,一个使用抽象接口类型(OID)定义,另一个使用具体类型(MyOID)定义 我想使用jackson以不同的方式序列化/反序列化字段,无论它们是使用抽象接口类型还是具体类型定义的: 注意,被序列化,包括类型信息(多态序列化),而被序列化为文本 为此,我将OID接口注释为: 并为每个具体类型分配了类型id: 最后,对容器

  • 根据这里描述的内容,我应该使用JSR-310表示而不是数字表示来序列化对象。但是,我得到了数字表示。可能有什么问题? 我是这样配置我正在使用的映射器的: 这是我得到的反序列化示例 对于以下事例类:

  • 我正在尝试使用RestTemplate使用REST服务。我无法反序列化JSON响应。我正在使用一个自定义反序列化程序,我的JSON有3个节点,但看起来只有一个节点到达反序列化程序。以下是更多详细信息。 以下是JSON的响应: 我正在使用@jsondeselizer对属性Hello的响应类使用自定义反序列化器。 当我执行如下readTree时: 它到达了反序列化方法,看起来它只有一个节点,而不是下面

  • 问题内容: 我正在使用JAVA 1.6和Jackson 1.9.9我有一个枚举 我添加了一个@JsonValue,这似乎可以将对象序列化为: 但是当我尝试反序列化时,我得到了 我在这里想念什么? 问题答案: 如果你希望将枚举类与其JSON表示完全脱钩,则@xbakesx指出的序列化器/反序列化器解决方案是一个很好的解决方案。 另外,如果你喜欢一个独立的解决方案,则基于·和·注释的实现会更方便。 因