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