Java 8 异常:com.fasterxml.jackson.datatype.jsr310.deser.InstantDeserializer 没有默认(无参数)构造函数
Java 8 Exception: com.fasterxml.jackson.datatype.jsr310.deser.InstantDeserializer has no default (no arg) constructor
我有一个模型 class,它有一个字段:
@JsonDeserialize(using = InstantDeserializer.class)
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private OffsetDateTime offsetDt;
当向服务器发送此模型的请求时,我的控制器抛出异常:
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 构造函数的 class,因此您可以从 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)
我有一个模型 class,它有一个字段:
@JsonDeserialize(using = InstantDeserializer.class)
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private OffsetDateTime offsetDt;
当向服务器发送此模型的请求时,我的控制器抛出异常:
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 构造函数的 class,因此您可以从 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)