Невозможно десериализовать java.time.Instant - PullRequest
0 голосов
/ 07 мая 2018

У меня есть RestEasyClient, который должен десериализовать объект, внутри которого находится java.time.Instant. Попытался зарегистрировать новый JavaTimeModule от jsr310, но все равно получил ошибки:

    ObjectMapper mapper = new ObjectMapper()
            .registerModule(new JavaTimeModule());

    ResteasyClient client = new ResteasyClientBuilder()
            .register(mapper)
            .build();
    ResteasyWebTarget target = client.target(UriBuilder.fromPath(SERVICE_URL + "/api"));

Ошибка:

Невозможно создать экземпляр java.time.Instant: не найдено подходящего конструктора, невозможно десериализовать из значения Object (отсутствует конструктор или создатель по умолчанию или, возможно, необходимо добавить / включить информацию о типе?)

После изменения Rest Server для правильной сериализации класса Instant (например: "fromTime": 1525681860)

Новая ошибка:

Невозможно создать экземпляр java.time.Instant: нет конструктора с двумя аргументами / двумя аргументами / метода фабрики для десериализации из числового значения (1.52568186E9)

Мне удалось смоделировать это:

    ObjectMapper deserializer = new ObjectMapper()
            .registerModule(new JavaTimeModule());

    Instant probe = deserializer.readValue("1525681860", Instant.class);
    System.out.println(probe);

Если я удаляю строку «registerModule», я повторяю ту же ошибку.

Следовательно, вывод заключается в том, что ResteasyClient не регистрирует модуль. Я определенно делаю что-то не так.

1 Ответ

0 голосов
/ 07 мая 2018

Вы можете определить ContextResolver для ObjectMapper:

public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {

    private final ObjectMapper mapper;

    public ObjectMapperContextResolver() {
        this.mapper = createObjectMapper();
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
        return mapper;
    }

    private ObjectMapper createObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());
        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        return mapper;
    }
}

И затем зарегистрируйте распознаватель в экземпляре вашего клиента:

ResteasyClient client = new ResteasyClientBuilder()
    .register(ObjectMapperContextResolver.class).build();

В качестве альтернативы вы можете зарегистрировать экземпляр JacksonJsonProvider. Этот класс является базовой реализацией абстракций JAX-RS (MessageBodyReader и MessageBodyWriter), необходимых для привязки содержимого JSON к объектам Java и из них.

Вы можете использовать конструктор , который принимает ObjectMapper экземпляр.

...