2014-11-23 5 views
16

मैं निम्नलिखित वर्ग है कि मैं वसंत डाटास्टोर जावा 8 SpringData-MongoDB का उपयोग कर BSON तारीख के रूप में त्वरित

@Document() 
public class Tuple2<T extends Enum<T>> { 

@Id 
private String id; 

@Indexed 
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) 
private final Instant timeCreated; 

... 
} 

DateTimeFormat एनोटेशन जावाडोक राज्यों का उपयोग कर MongoDB में संग्रहीत करना चाहते हैं है

की घोषणा: एक है कि क्षेत्र को दिनांक समय के रूप में स्वरूपित किया जाना चाहिए। शैली पैटर्न, आईएसओ दिनांक समय पैटर्न, या कस्टम प्रारूप पैटर्न स्ट्रिंग द्वारा स्वरूपण का समर्थन करता है। Java.util.Date, java.util.Calendar, java.long.Long, जोडा-टाइम मान प्रकारों पर लागू किया जा सकता है; और स्प्रिंग 4 और जेडीके 8 के रूप में, जेएसआर -310 जावा.टाइम प्रकारों के लिए भी।

मैं वसंत 4.1.1 और जेडीके 8 का उपयोग कर रहा हूं, इसलिए मुझे उम्मीद है कि यह Instant पर लागू होगा। हालांकि, यहां क्या वास्तव में संग्रहीत किया जाता है है:

"timeCreated" : { 
    "seconds" : NumberLong(1416757496), 
    "nanos" : 503000000 
} 

अगर मैं लिख सकते हैं और तरह का दिनांक this answer में विस्तार से बताया तो यह काम करता है के लिए त्वरित से कस्टम कनवर्टर रजिस्टर, हालांकि मुझे लगता है कि से बचना चाहते हैं, के रूप में मुझे यकीन है कि वहाँ होना चाहिए हूँ एक बेहतर तरीका है।

प्रारूप JDK 8.

में JSR-310 java.time पैकेज का उपयोग DateTimeFormat एनोटेशन के साथ एनोटेट क्षेत्रों:

आगे वसंत स्रोत कोड में खुदाई करने के बाद मैं निम्नलिखित वर्ग Jsr310DateTimeFormatAnnotationFormatterFactory जो होनहार लग रहा है मिल गया है

इसका स्रोत Instant का संदर्भ नहीं देता है, लेकिन यह ऑफ़सेटटाइम और लोकलटाइम का संदर्भ देता है। इसके बावजूद, जब मैं अपने उदाहरण में ऑफसेटडेटाइम होने के लिए तत्काल बदलता हूं, तो यह अभी भी ISODATE के बजाय एक समग्र ऑब्जेक्ट के रूप में संग्रहीत है।

क्या गुम है?

उत्तर

4

मुझे लगता है कि समस्या यह है कि आप एक समय के रूप में Instant का उपयोग करने का प्रयास कर रहे हैं। संकल्पनात्मक रूप से यह समयरेखा का एक बिंदु है और यह स्वरूपण को इंगित नहीं करता है।

जैसा कि हम जानते हैं, जावा 8 टाइम एपीआई को जोडा-टाइम (और जोडा-टाइम के डेवलपर्स के पक्षपात के साथ) में एक आंख के साथ विकसित किया गया था।

एक त्वरित इस तरह के कालक्रम या समय क्षेत्र के रूप में, किसी भी अन्य कारक पर ध्यान दिए बिना समय में एक बिंदु का प्रतिनिधित्व किया जाना चाहिए: यहाँ Joda समय Instant से टिप्पणी है।

कारण है कि जो 3.0 संस्करण के बाद से वसंत में दिखाई दिया JodaDateTimeFormatAnnotationFormatterFactory में org.joda.time.Instant के लिए कोई स्वरूपण संभावनाओं है कि। और यह Jsr310DateTimeFormatAnnotationFormatterFactory

में लागू नहीं किया गया था, इसलिए, आपको कस्टम कनवर्टर का उपयोग करना चाहिए या अधिक उपयुक्त वर्ग का उपयोग करने पर विचार करना चाहिए।

+0

उचित लगता है। 'Jsr310DateTimeFormatAnnotationFormatterFactory' में' ऑफसेटडेट टाइम 'है, लेकिन यह प्रारूपित नहीं है – Vic

+0

@Vic DateTimeFormat एनोटेशन भंडारण (mongodb) में स्वरूपण के लिए ज़िम्मेदार नहीं है। यह एप्लिकेशन-स्तर पर काम करता है (उदाहरण के लिए जेएसपी पृष्ठों पर स्वरूपण)। डेटा को उचित प्रकार में परिवर्तित करने के लिए कन्वर्टर्स हैं। मुझे जावा 8 टाइम एपीआई के लिए केवल 'ZonedDateTimeToCalendarConverter' मिला। तो क्या आप ZonedDateTime का उपयोग करने का प्रयास कर सकते हैं? – retroq

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