2012-11-27 13 views
16

v2.1.1 से बाहर org.joda.time.DateTime या LOCALDATE के कहने deserialize नहीं कर सकते, joda module.START_OBJECT टोकन

मैं objectMapper.readValue (फ़ाइल का उपयोग कर एक इकाई परीक्षण में एक POJO के लिए एक json फ़ाइल में बदल सकते हैं, pojo .class); 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

के साथ होता है:

हालांकि, जब एक स्प्रिंग RESTTemplate ग्राहक default json converter invokes Joda प्रकार (DATETIME या LOCALDATE) के साथ डोमेन ऑब्जेक्ट वाला एक InputStream कन्वर्ट करने के लिए, यह एक त्रुटि उत्पन्न

 
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 क्यों है?

+0

क्या आप इसे ठीक करने के लिए प्रबंधित करते हैं? मुझे लिफ्ट – Adrian

उत्तर

19

एक ऐसी ही समस्या मैं निम्नलिखित किया था हल करने के लिए,

मैं http://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-joda/2.2.1 से जैक्सन-डेटाप्रकार-Joda-2.2.1.jar डाउनलोड किया है, तो आप Maven का उपयोग कर रहे निर्भरता परिभाषा वहाँ भी है।

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

आयात इस तरह दिखेगा:

तो मैं इस प्रकार मेरे एप्लिकेशन में हर LOCALDATE क्षेत्र के लिए एक एनोटेशन जोड़ा

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

और समस्या गायब हो गई।

आशा है कि इससे मदद मिलती है!

+0

आप जोडा-टाइम का किस संस्करण का उपयोग कर रहे हैं? और क्या डेटटाइम के लिए यह वही समाधान है? जैसे '@JsonDeserialize (= dateTimeDeserializer.class का उपयोग करके)' –

+0

जोडा-टाइम का संस्करण 2.3 है और दूसरे प्रश्न के बारे में मेरा मानना ​​है कि मैंने उन लोगों की कोशिश की है, इसलिए मुझे लगता है कि इसे उस के लिए भी काम करना चाहिए – drginm

5

मुझे लगता है कि इसे धारावाहिक और deserializer के बीच कुछ विसंगति के साथ करना है; ताकि एक दूसरे को पैदा कर सके (मुझे लगता है कि जोडा मॉड्यूल वास्तव में पंजीकृत होने पर, इंक की एक सरणी लिखता है)। यह संभवतः इसलिए होगा क्योंकि या तो deserializer या serializer पंजीकरण गुम है।

डिफॉल्ट रूप से, बिना किसी अतिरिक्त हैंडलिंग के, जैक्सन जोडा को सिर्फ पीओजेओ के प्रकार पर विचार करेगा, और गेटर्स/सेटर्स का उपयोग करेगा। लेकिन जोडा मॉड्यूल अधिक कॉम्पैक्ट प्रतिनिधित्व (स्ट्रिंग्स, सरणी) का उपयोग करता है। तो क्या हो रहा है यह है कि धारावाहिक पक्ष जोडा मॉड्यूल का उपयोग नहीं कर रहा है; और deserialization है।

+0

में deserialization के साथ एक ही समस्या है मेरे परिदृश्य में, यह वास्तव में एक serialization मुद्दा था। स्प्रिंग एमवीसी/एकीकरण जोडाटाइप ऑब्जेक्ट की सरणी को क्रमबद्ध कर रहा था। '@JsonSerialize (= dateTimeSerializer.class का उपयोग करके) के साथ टिप्पणी करना ठीक है क्योंकि वसंत स्वचालित रूप से जैक्सन मॉड्यूल जोड़ता है यदि वे कक्षा में हैं इसलिए एनोटेशन के साथ deserialization की आवश्यकता नहीं थी। –

0

यहां मुख्य मुद्दा यह है कि वसंत जॉर्डटाइम को अलग तरीके से परिवर्तित कर रहा है, उदाहरण के लिए जर्सी।

यह क्या मैं में करना पड़ा है मेरी 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> 

यहाँ आप

3

आप Joda समय के लिए दोनों क्रमबद्धता और डी-क्रमबद्धता का उपयोग करना चाहिए java-json-client पुस्तकालय से no.bouvet.jsonclient.spring.JsonClientJackson2ObjectMapperFactoryBean पा सकते हैं ; उन क्षेत्रों के खिलाफ जिन्हें आप सहेजने और लाने की कोशिश कर रहे हैं।
ऐसा करके, हम जैक्सन (जावा से मोंगो/जेसन और मोंगो/जेसन को जावा रूपांतरणों) के लिए दोनों पक्ष जिम्मेदारियां देंगे।

नमूना कोड:

@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 

यह करने के बाद, सरल बचाने के लिए और मोंगो (जावा रेपो कक्षाओं के माध्यम से) पर findOne प्रश्नों बिना किसी समस्या के लिए काम करेंगे। उम्मीद है की यह मदद करेगा।

संबंधित मुद्दे