Исключение Java 8: com.fasterxml.jackson.datatype.jsr310.deser.InstantDeserializer не имеет конструктора по умолчанию (без аргументов) - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть класс модели с полем:

 @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 требует конструктора без аргументов, но есть ли обходной путь?Большое спасибо.

1 Ответ

0 голосов
/ 12 ноября 2018

Ошибка говорит о том, что вам нужен класс без конструктора 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)
...