2015-04-14 6 views
5

मुझे जावा से जेसन तक जोडा डेटटाइम को लगातार क्रमबद्ध करने और deserializing और समस्याएं फिर से वसंत बूट और जैक्सन-डाटाबेस 2.5.2 का उपयोग कर समस्याएं हैं। मेरा pom.xml इस तरह दिखता है।जैक्सन और वसंत के साथ जोडा डेटटाइम को सीरियलाइज करना

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.5.2</version> 
</dependency> 

<dependency> 
    <groupId>com.fasterxml.jackson.datatype</groupId> 
    <artifactId>jackson-datatype-joda</artifactId> 
    <version>2.5.2</version> 
</dependency> 

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-web</artifactId> 
    <version>1.2.1.RELEASE</version> 
</dependency> 

जब मैं डेटटाइम ऑब्जेक्ट को क्रमबद्ध करता हूं तो मुझे डेटटाइम का प्रतिनिधित्व करने वाला एक पूर्णांक मिलता है। वास्तव में मुझे उम्मीद नहीं थी, लेकिन ठीक है। लेकिन जब मैं अपने वस्तु को बचाने के लिए जाना वापस मैं किसी कारण यह एक पूर्णांक के लिए यह serializing है के लिए निम्न त्रुटि ...

Failed to convert property value of type 'java.lang.String' to required type 'org.joda.time.DateTime' for property 'endTime'; 
nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type org.joda.time.DateTime for value '1428600998511' 

मिलता है लेकिन फिर इसे deserializing जैसे कि यह एक स्ट्रिंग है, जो यह नहीं है। मैंने बाकी सेवा को कॉल करने से पहले एंडटाइम = नई तिथि (intValue) सेट करने का भी प्रयास किया और यह एक तिथि-समय पर 'मंगल अप्रैल 28 2015 00:00:00 जीएमटी -00000 (पीडीटी)' जैसी स्ट्रिंग को बदलने की कोशिश में विफल रहा।

मैं क्या गलत कर रहा हूं?

अद्यतन:

यहाँ JSON कि मैं और कि मैं तुरंत अभी वापस पोस्ट करने की कोशिश हो रही है।

{ 
    id: 4, 
    username: "", 
    name: "eau", 
    email: "aoue", 
    verbatimLocation: null, 
    latitude: null, 
    longitude: null, 
    startTime:null, 
    endTime: 1429034332312, 
    description: "ueoa", 
    media: [ ], 
    timeSubmitted: 1428600998000, 
    status: null, 
    submissionid: null 
} 
+0

क्या आप कुछ प्रासंगिक JSON को अंदर और बाहर पोस्ट कर सकते हैं? ऐसा लगता है कि जेएसओएन को आपके कंट्रोलर पर जो भी पोस्ट कर रहा है वह आपकी तिथि को स्ट्रिंग के रूप में पोस्ट कर रहा है। –

+0

शायद आपको '@ JsonFormat' के साथ फ़ील्ड को एनोटेट करने की आवश्यकता है? जैसे '@JsonFormat (आकार = JsonFormat.Shape.STRING, पैटर्न =" yyyy-MM-dd ")' – beerbajay

+0

ठीक है, यह चाल चल रहा था! धन्यवाद! अंत में मैं अपनी तिथियों को तब तक संग्रहीत करने के लिए वापस चला गया जब तक कि जावास्क्रिप्ट पक्ष के रूप में, मैं जिस उपकरण का उपयोग कर रहा था, वह उसी प्रारूप में तारीखों के साथ अच्छी तरह से काम नहीं कर रहा था, जिसका उपयोग मैं जावा पक्ष पर कर रहा था। यह बहुत निराशाजनक था। – crowmagnumb

उत्तर

8

एक और अधिक फिर से प्रयोग करने योग्य तंत्र के लिए, आप बना सकते हैं एक JsonSerializer:

/** 
* When passing JSON around, it's good to use a standard text representation of 
* the date, rather than the full details of a Joda DateTime object. Therefore, 
* this will serialize the value to the ISO-8601 standard: 
* <pre>yyyy-MM-dd'T'HH:mm:ss.SSSZ</pre> 
* This can then be parsed by a JavaScript library such as moment.js. 
*/ 
public class JsonJodaDateTimeSerializer extends JsonSerializer<DateTime> { 

    private static DateTimeFormatter formatter = ISODateTimeFormat.dateTime(); 

    @Override 
    public void serialize(DateTime value, JsonGenerator gen, SerializerProvider arg2) 
      throws IOException, JsonProcessingException { 

     gen.writeString(formatter.print(value)); 
    } 

} 

तो फिर तुम साथ अपने get तरीकों पर टिप्पणी कर सकते हैं:

@JsonSerialize(using = JsonJodaDateTimeSerializer.class) 

यह आप अपने आवेदन में एक जैसा स्वरूपण देता है, हर जगह पाठ पैटर्न दोहराए बिना। यह टाइमज़ोन भी जागरूक है।

+0

धन्यवाद, ठीक वही मैं क्या देख रहा था! – sash

+0

यह कैसे deserialize करने के लिए? – moffeltje

+0

एक '@ जेसन डीसेरियलाइज' एनोटेशन भी है। – Steve

2

अंत मैं beerbajay के रूप में ऐसा करने में सक्षम था में कहा और उपयोग ...

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss.SSSZ") 

... मेरी तारीख को क्रमानुसार करने। हालांकि, मैंने डेटटाइम की बजाय लांग का उपयोग करने के लिए वापस जाकर समाप्त किया क्योंकि जावास्क्रिप्ट पक्ष की तारीख से निपटना बहुत परेशानी थी। Jquery datepicker, joda DateTime, और postgresql के लिए काम करने वाले पैटर्न को ढूंढने के लिए मेरे पास कम समय के लिए बहुत अधिक काम साबित हुआ।

+0

और आप अपनी मूल समस्या के आसपास कैसे पहुंचे? –

+0

बीटीडब्ल्यू, यदि आप एक विशेष प्रारूप चाहते थे, और इसे हर जगह तारीखों के लिए उपयोग करते हैं, तो आप इसे application.properties में 'spring.jackson.date-format' के साथ निर्दिष्ट कर सकते हैं http://docs.spring.io/spring-boot/ दस्तावेज़/1.2.3.RELEASE/संदर्भ/htmlsingle/# सामान्य अनुप्रयोग-गुण –

+0

ठीक है, मैं इसके चारों ओर नहीं मिला। अंत में मैं अभी डेटाबेस में लंबे समय तक अपनी तिथियों को संग्रहीत करने के लिए वापस चला गया। जब मेरे पास अधिक समय होता है तो मैं moment.js या किसी अन्य दिनांक उपयोगिता का उपयोग करने में देख सकता हूं जो एक अधिक जटिल स्ट्रिंग प्रारूप को संभाल सकता है। – crowmagnumb

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