Могу ли я сказать Джексону просто установить значения соответствующих типов при преобразовании карты в POJO, а не десериализацию и повторную сериализацию? - PullRequest
0 голосов
/ 22 октября 2018

Скажем, у меня есть следующий класс:

public class MyPojo {
    public ZonedDateTime now;
}

Чтобы преобразовать Map<String, Object> в этот POJO, в соответствии с https://stackoverflow.com/a/16430704/1225328, ObjectMapper#convertValue можно использовать:

Map<String, Object> myMap = new HashMap<String, Object>(){{
    put("now", ZonedDateTime.now());
}};
ObjectMapper objectMapper = new ObjectMapper();
MyPojo myPojo = objectMapper.convertValue(myMap, MyPojo.class);

Приведенный выше код завершается ошибкой, например:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.ZonedDateTime` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

Я думаю, что Джексон сначала "десериализовал" значение ZonedDateTime карты в Map<String, Object>, а затем пытается восстановить экземпляр ZonedDateTime изэта сгенерированная карта для установки свойства POJO now.

Мне не нужно что-то умное;есть ли способ сообщить Джексону "если вы найдете на входной карте значение того же типа, что и свойство POJO, имя которого соответствует ключу, то просто установите его и продолжайте"?

1 Ответ

0 голосов
/ 22 октября 2018

Вам нужно добавить библиотеку jackson-datatype-jsr310 в ваш путь к классам и зарегистрировать JavaTimeModule в вашем ObjectMapper, чтобы правильно сериализовать / десериализовать java.time Объекты:

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

Это заставит ваш пример работать.

...