Невозможно десериализовать значение типа `java .time.Instant` - Джексон - PullRequest
0 голосов
/ 05 марта 2020

Имея такой класс

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public final class ActiveRecoveryProcess {

    private UUID recoveryId;
    private Instant startedAt;
}

Я получаю com.fasterxml.jackson.databind.exc.InvalidFormatException с сообщением Cannot deserialize value of typejava .time.Instant from String "2020-02-22T16:37:23": Failed to deserialize java.time.Instant: (java.time.format.DateTimeParseException) Text '2020-02-22T16:37:23' could not be parsed at index 19

JSON ввод

{"startedAt": "2020-02-22T16:37:23", "recoveryId": "6f6ee3e5-51c7-496a-b845-1c647a64021e"}

Конфигурация Джексона

    @Autowired
    void configureObjectMapper(final ObjectMapper mapper) {
        mapper.registerModule(new ParameterNamesModule())
                .registerModule(new Jdk8Module())
                .registerModule(new JavaTimeModule());
        mapper.findAndRegisterModules();
    }

РЕДАКТИРОВАТЬ

JSON генерируется из postgres

jsonb_build_object(
                        'recoveryId', r.recovery_id,
                        'startedAt', r.started_at
)

, где r.started_at - TIMESTAMP.

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Один из способов сделать это - создать Converter.

public final class NoUTCInstant implements Converter<LocalDateTime, Instant> {
    @Override
    public Instant convert(LocalDateTime value) {
        return value.toInstant(ZoneOffset.UTC);
    }
    @Override
    public JavaType getInputType(TypeFactory typeFactory) {
        return typeFactory.constructType(LocalDateTime.class);
    }
    @Override
    public JavaType getOutputType(TypeFactory typeFactory) {
        return typeFactory.constructType(Instant.class);
    }
}

Затем аннотировать поле.

@JsonDeserialize(converter = NoUTCInstant.class)
private Instant startedAt;
1 голос
/ 05 марта 2020

Строка, которую вы пытаетесь проанализировать, 2020-02-22T16: 37: 23 , не заканчивается Z . Мгновенное ожидание этого, так как оно означает UT C. Это просто не может быть проанализировано. Чтобы решить эту проблему, объедините строку с Z.

        String customInstant = "2020-02-22T16:37:23";

        System.out.println("Instant of: " + Instant.parse(customInstant.concat("Z")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...