无法从START_OBJECT令牌中反序列化org.joda.time.DateTime或LocalDate的实例


问题内容

v2.1.1,joda模块。

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

但是,当Spring
RESTTemplate客户端调用默认的json转换器以转换包含具有Joda类型(DateTime或LocalDate)的域对象的inputStream时,它将生成错误:objectMapper.readValue(httpInputMessage.getBody(), javaType)

com.fasterxml.jackson.databind.JsonMappingException:无法从START_OBJECT令牌中反序列化org.joda.time.DateTime实例
来源: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.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:559)
在com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObjectUsingNonDefault(BeanDeserializer.java:393)
在com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:289)
在com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.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.deser.impl.MethodProperty.deserializeSetAndReturn(MethodProperty.java:106)
在com.fasterxml.jackson.databind.deser.BuilderBasedDeserializer.deserializeFromObject(BuilderBasedDeserializer.java:326)
在com.fasterxml.jackson.databind.deser.BuilderBasedDeserializer.deserialize(BuilderBasedDeserializer.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.deser.impl.MethodProperty.deserializeSetAndReturn(MethodProperty.java:106)
在com.fasterxml.jackson.databind.deser.BuilderBasedDeserializer.deserializeFromObject(BuilderBasedDeserializer.java:

LocalDate发生相同的问题

com.fasterxml.jackson.databind.JsonMappingException:意外的令牌(START_OBJECT),预期的START_ARRAY:预期的JSON数组,字符串或数字
来源:org.mortbay.jetty.HttpParser$Input@d297c0; 行:1,列:51
在com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)
在com.fasterxml.jackson.databind.DeserializationContext.wrongTokenException(DeserializationContext.java:692)
在com.fasterxml.jackson.datatype.joda.deser.LocalDateDeserializer.deserialize(LocalDateDeserializer.java:50)
....

为什么呼叫链在一种情况下传递START_OBJECT而在另一种情况下传递START_ARRAY?


问题答案:

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

我从http://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-
datatype-
joda/2.2.1

下载了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;

问题消失了。

希望这可以帮助!