2012-11-27 15 views
16

v2.1.1, joda module.Không thể deserialize thể hiện của org.joda.time.DateTime hoặc LOCALDATE ra khỏi START_OBJECT thẻ

tôi có thể chuyển đổi một tập tin JSON để một POJO trong một thử nghiệm đơn vị sử dụng objectMapper.readValue (tập tin, pojo .class);

Tuy nhiên, khi một khách hàng mùa xuân RESTTemplate gọi các default json converter để chuyển đổi một InputStream chứa đối tượng miền với các loại Joda (DateTime hoặc LOCALDATE), nó tạo ra một lỗi: 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: 

Cùng một vấn đề xảy ra với 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) 
.... 

Tại sao chuỗi cuộc gọi đi qua START_OBJECT trong một trường hợp và START_ARRAY trong trường hợp khác?

+0

bạn có quản lý để khắc phục sự cố này không? Tôi đang gặp vấn đề tương tự với deserialization trong Lift – Adrian

Trả lời

19

Để giải quyết một vấn đề tương tự tôi đã làm những điều sau đây,

tôi tải jackson-datatype-Joda-2.2.1.jar từ http://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-joda/2.2.1 nếu bạn đang sử dụng maven định nghĩa phụ thuộc là có quá.

sau đó tôi đã thêm một chú thích cho mọi lĩnh vực LOCALDATE trong ứng dụng của tôi như sau:

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

nhập khẩu giống như thế này:

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

Và vấn đề biến mất.

Hy vọng điều này sẽ hữu ích!

+0

bạn đang sử dụng phiên bản joda nào? Và đó có phải là giải pháp tương tự cho DateTime không? ví dụ. '@JsonDeserialize (using = DateTimeDeserializer.class)' –

+0

phiên bản cho thời gian joda là 2.3 và liên quan đến câu hỏi khác tôi tin rằng tôi đã thử một vài trong số đó vì vậy tôi nghĩ rằng nó sẽ làm việc cho một trong đó cũng – drginm

5

Tôi nghĩ rằng điều này có liên quan đến một số khác biệt giữa trình nối tiếp và trình khử giải trình tự; do đó, một trong những sản xuất khác (tôi nghĩ rằng mô-đun Joda thực sự viết một mảng của ints, khi đăng ký). Điều này rất có thể là do thiếu đăng ký deserializer hoặc đăng ký serializer.

Theo mặc định, không xử lý thêm, Jackson sẽ xem xét các loại Joda chỉ POJO và sử dụng getters/setters. Nhưng mô-đun Joda sử dụng các biểu diễn nhỏ gọn hơn (Chuỗi, mảng). Vì vậy, những gì có thể xảy ra là bên tuần tự không sử dụng mô-đun Joda; và deserialization là.

+0

Trong kịch bản của tôi, nó thực sự là một vấn đề serialization. Spring MVC/Integration đã tuần tự hóa mảng của đối tượng JodaType. Chú thích với '@JsonSerialize (sử dụng = DateTimeSerializer.class)' hoạt động tốt khi Spring tự động thêm các mô-đun Jackson nếu chúng ở trên classpath do đó deserialization với các chú thích là không cần thiết. –

0

Vấn đề chính ở đây là Spring đang chuyển đổi JodaTime theo một cách khác, ví dụ như Jersey.

Đây là những gì tôi đã làm trong tôi 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> 

Ở đây bạn có thể tìm thấy no.bouvet.jsonclient.spring.JsonClientJackson2ObjectMapperFactoryBean từ thư viện java-json-client

3

bạn nên sử dụng cả hai serialization và de-serialization cho Joda thời gian ; chống lại những trường mà bạn đang cố lưu và tìm nạp.
Bằng cách đó, chúng tôi sẽ cung cấp cả hai trách nhiệm bên cho jackson (java đến mongo/json và mongo/json để chuyển đổi java).

Mẫu mã:

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

và đây là hàng nhập khẩu:

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 

Sau khi làm điều này, đơn giản lưu và truy vấn findOne trên Mongo (thông qua các lớp học java repo) sẽ làm việc mà không cần bất kỳ vấn đề. Hi vọng điêu nay co ich.

Các vấn đề liên quan