Java 8 异常 : com. fastxml.jackson.datatype.jsr310.deser.InstantDeserializer 没有默认(无参数)构造函数

标签 java json jackson fasterxml jsr310

我有一个具有字段的模型类:

 @JsonDeserialize(using = InstantDeserializer.class)
 @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
 private OffsetDateTime offsetDt;

当这个模型的请求发送到服务器时,我的 Controller 抛出异常:
Caused by: java.lang.IllegalArgumentException: 
Class com.fasterxml.jackson.datatype.jsr310.deser.InstantDeserializer 
has no default (no arg) constructor

pom.xml 有 2.8.11 版本的依赖:
 <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
    </dependency>

我知道这是由 @JsonDeserialize 需要无参数构造函数引起的,但是有解决方法吗?非常感谢。

最佳答案

该错误表明您需要一个没有 arg 构造函数的类,因此您可以从 InstantDeserializer 扩展. (以 InstantDeserializer 中的代码为例 super() 的参数)

public class DefaultInstantDeserializer extends InstantDeserializer<OffsetDateTime> {
    public DefaultInstantDeserializer() {
        super(OffsetDateTime.class, DateTimeFormatter.ISO_OFFSET_DATE_TIME,
                OffsetDateTime::from,
                a -> OffsetDateTime.ofInstant(Instant.ofEpochMilli(a.value), a.zoneId),
                a -> OffsetDateTime.ofInstant(Instant.ofEpochSecond(a.integer, a.fraction), a.zoneId),
                (d, z) -> d.withOffsetSameInstant(z.getRules().getOffset(d.toLocalDateTime())),
                true);
    }
}

然后你可以使用它:
@JsonDeserialize(using = DefaultInstantDeserializer.class)

关于Java 8 异常 : com. fastxml.jackson.datatype.jsr310.deser.InstantDeserializer 没有默认(无参数)构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53232600/

相关文章:

Java抽象类+继承——范围或名称解析

javascript - 如何在 Javascript 中创建一个 div 并将其定位在 html 模板的中间

javascript - 如何使用 jquery 解析 .json 文件

java - 使用 writeValueAsString 序列化对象后 Jackson 反序列化失败

Java Play FrameWork 2.3 使用 jackson 返回流式 Json

java - 使用 Rhino 在 Java 内部编译 JavaScript

java - 打印时遇到问题 (java)

java - 如何在反射中处理原始类型

javascript - 如何使用 JavaScript 枚举列表的 JSON 列表

java - 如何从 Jackson 中的自定义解串器调用默认解串器