Spring mvc 无法反序列化org.joda.time.DateTime或LocalDate的实例超出START\u对象标记

Spring mvc 无法反序列化org.joda.time.DateTime或LocalDate的实例超出START\u对象标记,spring-mvc,jackson,Spring Mvc,Jackson,v2.1.1 我可以在单元测试中使用objectMapper.readValue(file,pojo.class)将json文件转换为pojo 但是,当Spring RESTTemplate客户端调用转换包含Joda类型(DateTime或LocalDate)的域对象的inputStream时,它会生成一个错误:objectMapper.readValue(httpInputMessage.getBody(),javaType) com.fasterxml.jackson.databind.Js

v2.1.1

我可以在单元测试中使用objectMapper.readValue(file,pojo.class)将json文件转换为pojo

但是,当Spring RESTTemplate客户端调用转换包含Joda类型(DateTime或LocalDate)的域对象的inputStream时,它会生成一个错误:
objectMapper.readValue(httpInputMessage.getBody(),javaType)

com.fasterxml.jackson.databind.JsonMappingException:无法反序列化org.joda.time.DateTime的实例超出START\u对象标记 来源:org.mortbay.jetty.HttpParser$Input@46a09b; 行:1,列:752 位于com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164) 位于com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:599) 位于com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:593) 位于com.fasterxml.jackson.datatype.joda.deser.DateTimeDeserializer.deserialize(DateTimeDeserializer.java:51) 在com.fasterxml.jackson.datatype.joda.deser.DateTimeDeserializer.deserialize(DateTimeDeserializer.java:21)上 在com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:375)上 在com.fasterxml.jackson.databind.desr.BeandSerializer.\u反序列化使用PropertyBased(BeandSerializer.java:559) 在com.fasterxml.jackson.databind.deser.BeandSerializer.DeserializeFromObjectUsingNodefault(BeandSerializer.java:393)上 位于com.fasterxml.jackson.databind.deser.beanderiserializer.deserializeFromObject(beanderiserializer.java:289) 在com.fasterxml.jackson.databind.deser.BeandSerializer.deserialize(BeandSerializer.java:121)上 在com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize上(CollectionDeserializer.java:226) 在com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:203) 在com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:23) 在com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:375)上 在com.fasterxml.jackson.databind.desr.impl.MethodProperty.deserializeSetAndReturn(MethodProperty.java:106)上 位于com.fasterxml.jackson.databind.deser.builderbadeDeserializer.deserializeFromObject(builderbadeDeserializer.java:326) 在com.fasterxml.jackson.databind.deser.builderbadeDeserializer.deserialize(builderbadeDeserializer.java:143) 在com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize上(CollectionDeserializer.java:226) 在com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:203) 在com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:23) 在com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:375)上 在com.fasterxml.jackson.databind.desr.impl.MethodProperty.deserializeSetAndReturn(MethodProperty.java:106)上 在com.fasterxml.jackson.databind.deser.builderbadeDeserializer.deserializeFromObject(builderbadeDeserializer.java: LocalDate也存在同样的问题

com.fasterxml.jackson.databind.JsonMappingException: Unexpected token (START_OBJECT), expected START_ARRAY: expected JSON Array, String or Number at Source: org.mortbay.jetty.HttpParser$Input@d297c0; 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) .... com.fasterxml.jackson.databind.JsonMappingException:意外标记(START\u对象),预期的START\u数组:预期的JSON数组、字符串或数字 来源:org.mortbay.jetty.HttpParser$Input@d297c0;行:1,列:51 位于com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164) 位于com.fasterxml.jackson.databind.DeserializationContext.ErrorTokenException(DeserializationContext.java:692) 在com.fasterxml.jackson.datatype.joda.desr.LocalDateDeserializer.deserialize(LocalDateDeserializer.java:50) ....
为什么调用链在一种情况下传递START_对象,在另一种情况下传递START_数组?

我认为这与序列化程序和反序列化程序之间的差异有关;因此,一个产生另一个(我认为Joda模块在注册时实际上写入了一个int数组)。 这很可能是因为缺少反序列化程序或序列化程序注册

默认情况下,没有任何额外的处理,杰克逊会考虑JoDA类型只是POJOS,并使用GETSt/Stter。但是Joda模块使用更紧凑的表示(字符串、数组)。


所以可能发生的情况是序列化端没有使用Joda模块;而反序列化是。

为了解决类似的问题,我做了以下工作

我从中下载了jackson-datatype-joda-2.2.1.jar,如果您使用的是maven,依赖项定义也在那里

然后,我为我的应用程序中的每个LocalDate字段添加了注释,如下所示:

@JsonDeserialize(using=LocalDateDeserializer.class)
private LocalDate releasedDate;
导入内容如下所示:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.datatype.joda.deser.LocalDateDeserializer;
问题消失了


希望这有帮助!

这里的关键问题是Spring正在以一种不同的方式转换JodaTime,例如Jersey

这就是我在我的
应用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>


在这里,您可以从库中找到

您应该在joda time中同时使用序列化和反序列化;针对您试图保存和获取的字段。
通过这样做,我们将把双方的责任都交给jackson(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

完成此操作后,mongo上的简单save和findOne查询(通过java repo类)将不会出现任何问题。希望这会有所帮助。

您是否设法解决了此问题?我在Liftwhat版本的joda time中遇到了同样的反序列化问题?DateTime使用的是相同的解决方案吗?例如
@JsonDeserialize(using=DateTimeDeserializer.class)
joda time的版本是2.3,关于另一个问题,我相信我已经尝试了其中的两个,所以我认为它应该也适用于这个版本。在我的场景中,它确实是一个序列化
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