2013-01-11 16 views
7

यहाँ से उत्पन्न एक JAXB वर्ग के लिए अतिरिक्त विधियां जोड़ने मेरी XSD फ़ाइलस्कीमा

<?xml version="1.0" encoding="UTF-8"?> 
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="ns" 
    xmlns:tns="sns" elementFormDefault="qualified"> 

    <element name="document"> 
     <attribute name="title" use="required"/> 
    </element> 
</schema> 

से एक छोटी सी अंश है मैं maven-jaxb2-plugin का उपयोग इस से जावा वर्गों उत्पन्न करने के लिए। Document कक्षा में विधि title विशेषता के टेक्स्ट को वापस करने के लिए है।

मैं Document के लिए एक अतिरिक्त विधि जोड़ना चाहते हैं:

public String getStrippedTitle() { 
    return getTitle().replaceAll("\\s+", ""); 
} 

मैं अपने अतिरिक्त विधि unmarshalled वस्तु (बजाय मुझे बस इसे बुला या एक आवरण वर्ग लेखन) क्योंकि मैं पास करना चाहते हैं पर दिखाना चाहते हैं शीर्ष स्तरीय unmarshalled ऑब्जेक्ट एक स्ट्रिंग टेम्पलेट पर बंद है और यह मेरे अतिरिक्त विधि कॉलिंग उप-तत्वों पर पुनरावृत्त है।

मुझे instructions मिला लेकिन वे मुझे Unmarshaller पर एक संपत्ति सेट करने के लिए कहते हैं और मेरा (मैक ओएस एक्स, जावा 7) कार्यान्वयन किसी भी गुण का समर्थन करने के लिए प्रकट नहीं होता है।

मुझे यह कैसे करना चाहिए?

उत्तर

7

ब्रायन हेनरी के लिंक के बाद, मैंने पाया कि मैं अपनी स्कीमा फ़ाइल में बाध्यकारी अनुकूलन इनलाइन कर सकता था जो मैं चाहता था। प्रभाव ब्रायन के समाधान के समान ही है, लेकिन इसे com.sun.xml.internal के संदर्भ के संदर्भ की आवश्यकता नहीं है।

पहले, स्कीमा फ़ाइल कुछ हद तक संशोधित हो जाता है:

<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="ns" 
    xmlns:tns="sns" elementFormDefault="qualified" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
jaxb:version="2.0"> 

    <element name="document"> 
     <annotation> 
      <appinfo> 
       <jaxb:class implClass="DocumentEx" /> 
      </appinfo> 
     </annotation> 
     <attribute name="title" use="required"/> 
    </element> 
</schema> 

स्कीमा जावा कोड में संकलित किया जाता है, उत्पन्न ObjectFactory DocumentEx बजाय Document के पास भेजेगा।

public class DocumentEx extends Document { 
    public String getStrippedTitle() { 
     return getTitle().replaceAll("\\s+", ""); 
    } 
} 

Document (कक्षा मैं विस्तार कर रहा हूँ) अब भी स्कीमा करने वाली जावा कम्पाइलर द्वारा उत्पन्न होता है: DocumentEx एक वर्ग मैं बनाने के लिए, जो इस तरह दिखता है। अब जब मैं एक दस्तावेज़ unmarshall मैं वास्तव में एक DocumentEx वस्तु मिलती है:

JAXBContext jaxbContext = JAXBContext.newInstance("com.example.xml"); 
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
    unmarshaller.setSchema(testSchema); 
    DocumentEx doc = (DocumentEx)unmarshaller.unmarshal(xmlFile); 

वहाँ Oracle पर इस बात के लिए कुछ (मुश्किल से पार्स) प्रलेखन और O'Reilly पर कुछ उपयोगी उदाहरणों है।

2

आप लिंक किए गए दस्तावेज़ में देख रहे संपत्ति नाम को अपडेट करने का प्रयास कर सकते हैं। ऐसा करें:

com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.FACTORY 

या

"com.sun.xml.internal.bind.ObjectFactory" 

मुझे लगता है कि चाहते हैं कि PropertyException मैं आप देख रहे हैं आंकड़ा पिछले आप मिल जाएगा। सबसे गहन उत्तर here, सुझाव देता है कि यह काम करने की गारंटी नहीं है, लेकिन यह अब तक आने के बाद प्रयास करने लायक है। स्रोत कोड, जहां तक ​​मैंने देखा (दूर नहीं) इस संपत्ति का समर्थन करने के लिए प्रतीत होता है।

+0

यह काम करता है। धन्यवाद! क्या आपके पास कुछ अतिरिक्त तरीकों के साथ जावा कक्षाओं में एक एक्सएमएल फ़ाइल को अनारक्षित करने की बेहतर समग्र विधि के लिए कोई सुझाव है? मैं जेएक्सबी से पहले सैक्स की कोशिश कर रहा था, लेकिन ऐसा लगा कि मैं सिर्फ अपना खुद का (क्रमी) जेएक्सबी कार्यान्वयन लिख रहा था। –

+1

@NathanielWaisbrot - आपको एक्सएमएल स्कीमा से जेएक्सबी मॉडल उत्पन्न करने की आवश्यकता नहीं है। आप जो भी ऑब्जेक्ट मॉडल चाहते हैं उससे शुरू कर सकते हैं और एक्सएमएल मैपिंग को कॉन्फ़िगर करने के लिए जेएक्सबी एनोटेशन का उपयोग कर सकते हैं। –