2010-10-17 10 views
6

का उपयोग कर दिनांक वर्ग के लिए unmarshal करने, खेतों/प्रकार java.util.Date के गुणों मार्शल और xs:dateTime रूप unmarshalled और सब कुछ उम्मीद के रूप में काम करता है कर रहे हैं। JAXB बताएँ जावा पहले से JAXB का उपयोग करते समय एनोटेशन

लेकिन यदि क्षेत्र/संपत्ति का प्रकार Object है, तो जेएक्सबी unmarshals xs:dateTime से XMLGregorianCalendarImpl

मैं एक तरीका है कि अपने आप में java.util.Date को JAXB unmarshal तारीख-समय मान बनाता एनोटेशन का उपयोग खोजने की जरूरत है। अन्यथा, मुझे प्रत्येक उपयोग मामले में सभी unmarshalled मूल्यों के माध्यम से जाना होगा।

भले ही ऑब्जेक्ट फ़ील्ड वाले वर्गों पर परिभाषित करने के लिए कुछ अनमशशेल-हुक थे और उदाहरणों को मैन्युअल रूप से परिवर्तित करना अच्छा होगा। लेकिन मुझे कुछ भी नहीं मिला जो इस तरह इस्तेमाल किया जा सकता है।

ध्यान दें कि मेरे पास JAXB संदर्भ तक सीमित पहुंच है, क्योंकि इसका उपयोग अपाचे सीएक्सएफ के अंदर किया जाता है।

उत्तर

4

आप प्रकार की संपत्ति @XmlElement पर सेट कर सकते हैं।

@XmlElement(type=Date.class) 
public Object getGenericDateProperty() { 
    return date; 
} 

संपादित करें:

जब से तुम प्रकार पता नहीं है कि आप एक XmlAdapter इस्तेमाल कर सकते हैं। यदि unmarshalled मान एक XMLGregorian कैलेंडर है इसे एक तिथि में परिवर्तित करें। XmlAdapter बारे में अधिक जानकारी के लिए देखें:

+0

ऑब्जेक्ट हमेशा एक तारीख नहीं है। यह विभिन्न प्रकार हो सकता है। जेनरेट एक्सएसडी में, इसे xs: anyType के रूप में निर्दिष्ट किया गया है। तिथि संभावित मूल्यों में से एक है। – Iravanchi

+0

आप दिनांक प्रकारों के बीच कनवर्ट करने के लिए XmlAdapter लिख सकते हैं। –

+0

मेरे पास XMLGregorian कैलेंडर और दिनांक के बीच कनवर्ट करने के लिए XmlAdapter है, लेकिन मैं इसे @XmlJavaTypeAdapter का उपयोग करके ऑब्जेक्ट के प्रकार के क्षेत्र में लागू नहीं कर सकता - इसका परिणाम IllegalAnnotationException में होता है। – Iravanchi

5

ब्लेज Doughan के जवाब के अलावा:

मैं अंत में यह पता लगा सकता है, ब्लेज Doughan से मदद के लिए धन्यवाद। असल में उनका जवाब केवल एक छोटे से परिवर्तन के साथ काम करता है: यदि ऑब्जेक्ट प्रॉपर्टी के रूप में कई प्रकार के अनारक्षित होने की उम्मीद है, तो @XmlElements एनोटेशन का उपयोग करके कई @XmlElement एनोटेशन की आवश्यकता है।

@XmlElements 
     ({ 
       @XmlElement(name = "dateValue", type = Date.class), 
       @XmlElement(name = "stringValue", type = String.class), 
       @XmlElement(name = "booleanValue", type = Boolean.class), 
       @XmlElement(name = "listValue", type = ArrayList.class), 
       @XmlElement(name = "bytesValue", type = Byte[].class) 
     }) 
public Object getFieldValue() 
{ 
    return fieldValue; 
} 

नोट:: "नाम" को निर्दिष्ट इस काम करने के लिए आवश्यक है, के बाद से वहाँ marshaller/unmarshaller किस प्रकार की सामग्री की पहचान करने के लिए एक तरह से किया जाना चाहिए

यहाँ अब मेरे कोड है।

यहां दो छोटे मुद्दों कर रहे हैं:

  1. आप प्रकार की उम्मीद के सभी की एक सूची निर्दिष्ट करने की आवश्यकता है (जो तार्किक है, मार्शलिंग के मामले को देखते हुए)

  2. का कोई तरीका नहीं है इस संपत्ति के लिए एक एकल नाम निर्दिष्ट करें। मेरे मामले में, जहां सीएक्सएफ वेब सेवाओं में जेएक्सबी का उपयोग किया जाता है, डब्लूएसडीएल से उत्पन्न कोड .NET में इस फ़ील्ड को "आइटम" के रूप में नामित करता है। यदि कोई तरीका था, उदाहरण के लिए, एक्सएमएल तत्वों को किसी दूसरे नाम में लपेटने के लिए, जिसमें एक ही नाम है, जेनरेट कोड थोड़ा अच्छा हो सकता है।