2011-12-15 16 views
5

मैं 3 स्कीमा फ़ाइलें के होते हैं और जब जावा स्रोत XJC साथ उत्पन्न होता है तीन संकुल का उत्पादन, जिसके कारण फ़ाइल Visio XML Schema का उपयोग कर, मार्शल करने के लिए कोशिश कर रहा हूँ:जेएक्सबी रूट तत्वों के बारे में उलझन में है?

  • com.microsoft.schemas.visio._2003.core
  • com.microsoft.schemas.visio._2006.extension
  • com.microsoft.schemas.office.visio._2010.extension

मूल तत्व VisioDocument है, और कक्षाओं के सभी मैं उपयोग कर रहा हूँमें हैंपैकेज।

VisioDocumentType visioDoc = new VisioDocumentType(); 
... manipulated here ... 
JAXBContext jc = JAXBContext.newInstance("com.microsoft.schemas.visio._2003.core"); 
Marshaller m = jc.createMarshaller(); 
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
m.marshal(new JAXBElement<VisioDocumentType>(new QName("uri","local"), VisioDocumentType.class, visioDoc), bw); 

जब मार डाला, मैं इस त्रुटि मिलती है:

यहाँ मेरी एक्सएमएल फ़ाइल वास्ते करने के लिए अपने दृष्टिकोण है

javax.xml.bind.MarshalException 
- with linked exception: 
[com.sun.istack.internal.SAXException2: unable to marshal type "com.microsoft.schemas.visio._2003.core.PagePropsType" as an element because it is missing an @XmlRootElement annotation] 

मैं PagePropsType उपयोग कर रहा हूँ, लेकिन यह एक मूल तत्व नहीं है। जेएक्सबी क्यों सोचता है?

+0

संपत्ति आप 'com.microsoft.schemas.visio._2003.core.PagePropsType' के कहने सेट कर रहे हैं पर टिप्पणी की जाती है कैसे ? –

+0

'@XmlAccessorType (XmlAccessType।FIELD) @XmlType (name = "PageProps_Type", propOrder = { "पृष्ठ WidthOrPageHeightOrShdwOffsetX" }) 'क्या आप यही खोज रहे हैं? – Chris

+0

मेरा मतलब उस संपत्ति का था जिसे आप इंस्टेंस सेट कर रहे हैं, न कि 'पेजप्रॉप टाइप' पर। –

उत्तर

2

समस्या आपके कोड के ... manipulated here ... भाग में रहती है।

इस धारणा के आधार पर कि आप निम्नलिखित (या कुछ समान) करते हैं।

// you create a page prop 
PagePropsType pageProps = ... 

// then you feed it to a shape sheet 
ShapeSheetType shapeSheet = ... 
shapeSheet.getTextOrXFormOrLine().add(pageProps); 

इस मामले है, तो आपकी समस्या को सीधे सूची में pageProps जोड़ने में निहित है (ShapeSheetTypeStyleSheetType, वगैरह। के लिए एक सुपर क्लास है)।

यदि आप getTextOrXFormOrLine() विधि के दस्तावेज़ पर नज़र डालते हैं तो यह सूचीबद्ध करता है कि सूची किस तरह के प्रकार रख सकती है। प्रत्येक प्रकार को JAXBElement<...> में लपेटा जाता है ताकि आपको सूची में जोड़ने से पहले pageProps को लपेटना पड़े।

आप इस तरह यह करना चाहिए:

ObjectFactory objectFactory = new ObjectFactory(); 
JAXBElement<PagePropsType> pagePropsElement = objectFactory.createShapeSheetTypePageProps(pageProps); 

(ध्यान दें कि मैं XJC 2.2.4 का उपयोग किया है स्कीमा संकलित करने के लिए; मेरे लिए हर वर्ग के नाम Type साथ प्रत्यय है हो सकता है कि ऐसा क्यों है। मैं VisioDocumentType बजाय VisioDocument आप की तरह के साथ समाप्त हो गया है, लेकिन यह कोई फर्क नहीं करना चाहिए।)

+0

ऐसा लगता है कि मैं क्या खो रहा था, धन्यवाद। ('टाइप' की कमी एक टाइपो थी) – Chris

1

यदि आप अपना जेनरेट कोड देखते हैं, तो आपको वहां ObjectFactory क्लास मिलेगी। इस श्रेणी में एक विधि होनी चाहिए जो VisioDocumentJAXBElement में लिपटे हो, और यह वह वस्तु है जिसे आप मार्शलर को पास करना चाहते हैं।

VisioDocument के अंदर सेट की गई सभी वस्तुओं पर भी लागू होता है - उन्हें 'new' के साथ न बनाएं, लेकिन ObjectFactory का उपयोग करें।

+0

मैंने ऐसा किया लेकिन समस्याएं बनी हुई हैं। – Chris

+0

_Same आपके द्वारा VisioDocument के अंदर सेट की गई सभी ऑब्जेक्ट्स पर लागू होता है - उन्हें 'नया' के साथ न बनाएं, लेकिन ObjectFactory._ का उपयोग करें। मेरी राय में 'ऑब्जेक्ट फैक्ट्री' को _only_ का उपयोग करना चाहिए और अगर किसी को 'JAXBElement <...> में लिपटा गया प्रकार बनाना है ', अन्यथा यह सिर्फ कोड को प्रदूषित करता है। 'ऑब्जेक्ट फैक्ट्री' में 'createXxxType' जैसे तरीके केवल' new XxxType() 'को कॉल करते हैं। –