Невозможно десериализовать экземпляр org.joda.time.DateTime или LocalDate из токена START_OBJECT - программирование
Подтвердить что ты не робот

Невозможно десериализовать экземпляр org.joda.time.DateTime или LocalDate из токена START_OBJECT

v2.1.1, модуль joda.

Я могу преобразовать json файл в pojo в unit test, используя objectMapper.readValue(файл, pojo.class);

Однако, когда клиент Spring RESTTemplate вызывает json converter по умолчанию для преобразования входного потока, содержащего объект домена с типами Joda (DateTime или LocalDate), он генерирует ошибку: objectMapper.readValue(httpInputMessage.getBody(), javaType)

   
com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of org.joda.time.DateTime out of START_OBJECT token
at Source: [email protected]; line: 1, column: 752
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:599)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:593)
at com.fasterxml.jackson.datatype.joda.deser.DateTimeDeserializer.deserialize(DateTimeDeserializer.java:51)
at com.fasterxml.jackson.datatype.joda.deser.DateTimeDeserializer.deserialize(DateTimeDeserializer.java:21)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:375)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:559)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObjectUsingNonDefault(BeanDeserializer.java:393)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:289)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:226)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:203)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:23)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:375)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeSetAndReturn(MethodProperty.java:106)
at com.fasterxml.jackson.databind.deser.BuilderBasedDeserializer.deserializeFromObject(BuilderBasedDeserializer.java:326)
at com.fasterxml.jackson.databind.deser.BuilderBasedDeserializer.deserialize(BuilderBasedDeserializer.java:143)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:226)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:203)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:23)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:375)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeSetAndReturn(MethodProperty.java:106)
at com.fasterxml.jackson.databind.deser.BuilderBasedDeserializer.deserializeFromObject(BuilderBasedDeserializer.java:

Такая же проблема возникает с LocalDate

com.fasterxml.jackson.databind.JsonMappingException: Unexpected token (START_OBJECT), expected START_ARRAY: expected JSON Array, String or Number
at Source: [email protected]; line: 1, column: 51
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)
at com.fasterxml.jackson.databind.DeserializationContext.wrongTokenException(DeserializationContext.java:692)
at com.fasterxml.jackson.datatype.joda.deser.LocalDateDeserializer.deserialize(LocalDateDeserializer.java:50)
....

Почему цепочка вызовов передает START_OBJECT в одном случае и START_ARRAY в другом?

4b9b3361

Ответ 1

Чтобы решить подобную проблему, я сделал следующее:

Я загрузил jackson-datatype-joda-2.2.1.jar из http://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-joda/2.2.1, если вы используете maven, определение зависимости также существует.

то я добавил аннотацию для каждого поля LocalDate в своем приложении следующим образом:

@JsonDeserialize(using=LocalDateDeserializer.class)
private LocalDate releasedDate;

импорт выглядит следующим образом:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.datatype.joda.deser.LocalDateDeserializer;

И проблема исчезла.

Надеюсь, это поможет!

Ответ 2

Я думаю, что это связано с некоторым несоответствием между сериализатором и десериализатором; так что вы производите другой (я думаю, что модуль Joda фактически записывает массив ints, когда он зарегистрирован). Это, скорее всего, связано с отсутствием регистрации десериализатора или сериализатора.

По умолчанию, без какой-либо дополнительной обработки, Джексон будет рассматривать типы Джоды только POJO и использовать геттеры/сеттеры. Но модуль Joda использует более компактные представления (строки, массивы). Так что может случиться, что сторона сериализации не использует модуль Joda; и десериализация.

Ответ 3

вы должны использовать сериализацию и де-сериализацию для joda-time; против тех полей, которые вы пытаетесь сохранить и извлечь.
Поступая таким образом, мы предоставим обеим сторонам обязанности джексона (от java до mongo/json и mongo/json до java).

Пример кода:

@JsonDeserialize(using= LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
LocalDate dateFieldToBeConverted

и это импорт:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize

import com.fasterxml.jackson.databind.annotation.JsonSerialize

import com.fasterxml.jackson.datatype.joda.deser.LocalDateDeserializer

import com.fasterxml.jackson.datatype.joda.ser.LocalDateSerializer

import org.joda.time.LocalDate

После этого простые запросы save и findOne на mongo (через классы java repo) будут работать без каких-либо проблем. Надеюсь, это поможет.

Ответ 4

Ключевая проблема здесь в том, что Spring конвертирует JodaTime по-другому, чем, например, в Джерси.

Это то, что я должен был сделать в своем app-servlet.xml:

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                <bean class="no.bouvet.jsonclient.spring.JsonClientJackson2ObjectMapperFactoryBean"/>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

Здесь вы можете найти no.bouvet.jsonclient.spring.JsonClientJackson2ObjectMapperFactoryBean из java-json-client