2012-01-05 21 views
13

मैं जेएक्सबी unmarshalling के साथ एक समस्या में भाग रहा हूँ। मुझे लगता है कि मैंने इसे ठीक से कोड किया है, लेकिन मेरी unmarshalled वस्तु शून्य पैरामीटर के साथ वापस आती है। नतीजतन, मुझे लगता है कि जब unmarshalling, JAXB उपयुक्त XML संरचना नहीं देख रहा है कि यह उम्मीद कर रहा है। हालांकि, मुझे कोई त्रुटि संदेश या कोई अपवाद नहीं मिला है।जेएक्सबी unmarshalling डीबग कैसे करें?

क्या अनचाहे प्रक्रिया के माध्यम से कदम उठाने के लिए वैसे भी है, यह देखने के लिए कि यह कहां/क्यों मेरे ऑब्जेक्ट को पॉप्युलेट करने में विफल रहा है?

वास्तविक unmarshalling कोड काफी सांसारिक है:

public <T> T unmarshall(Node node, Class<T> clazz) throws JAXBException { 
    // Creating an unmarshaller 
    Unmarshaller u = JAXBContext.newInstance(clazz).createUnmarshaller(); 

    // unmarshal an instance node into Java content 
    return clazz.cast(u.unmarshal(node, clazz).getValue()); 
} 

हालांकि, जब मैं इसे कहते हैं, मैं प्रकार clazz की एक वस्तु लौट आए (उम्मीद के रूप में) मिलता है, लेकिन आबादी वाले।

डीओएम ऑब्जेक्ट जिसे मैं अनारशल करने की कोशिश कर रहा हूं वह किसी तृतीय पक्ष API द्वारा उत्पन्न होता है। मैं पहले से ही unmarshalling के साथ कुछ बेहद अजीब व्यवहार में भाग गया है, यही कारण है कि मैं प्रक्रिया को डीबग करने में सक्षम होना चाहता हूँ। उदाहरण के लिए, यदि मैं DOM ऑब्जेक्ट (यानी: doc.getByElementName ("myElement") के भीतर एक उप-तत्व को अनमर्शल करने का प्रयास करता हूं। आइटम (0)), यह चुपचाप विफल रहता है। हालांकि, अगर मैं दस्तावेज़ को एक स्ट्रिंग में रूपांतरित करता हूं, और इसे एक नए दस्तावेज़ में पुनः आयात करता हूं, तो यह इसे ठीक से परिवर्तित करता है।

मुझे इस मुद्दे को डीबग करने के बारे में जानने के लिए काफी निराश होना शुरू हो रहा है।

किसी भी अंतर्दृष्टि के लिए धन्यवाद!

एरिक

उत्तर

7

एक दृष्टिकोण आप ले सकता है JAXB उपयोग करने के लिए अपने एनोटेट वर्गों से एक XML स्कीमा उत्पन्न करने के लिए है। यह दर्शाता है कि जेएक्सबी इनपुट दस्तावेज़ की तरह दिखने की अपेक्षा करता है। फिर यह एक्सएमएल स्कीमा के खिलाफ अपने एक्सएमएल दस्तावेज़ को सत्यापित करने के लिए यह देखने के लिए कि क्या यह जेएक्सबी की अपेक्षाओं के अनुरूप है।

+0

लिंक के लिए धन्यवाद। पहले कभी कोशिश नहीं की; इसे एक शॉट दे देंगे। लेकिन यह देखते हुए कि मैंने एक्सएसडी से जेएक्सबी कक्षाएं उत्पन्न की हैं, ऐसा लगता है कि यह पीछे की तरफ जा रहा है। लेकिन मुझे अभी भी यह एक सुरुचिपूर्ण समाधान नहीं मिला है। जेएक्सबी एक पूर्ण ब्लैक बॉक्स की तरह काम कर रहा है, और बिना किसी संकेतक के यह बताता है कि यह क्या कर रहा है, मुझे नहीं पता कि यह क्यों विफल रहा है। मुझे यह देखने के लिए एक तरीका खोजना अच्छा लगेगा कि यह "क्या" कर रहा है और/या जहां समस्याएं झूठ बोल रही हैं। –

+0

सुझाव के लिए धन्यवाद। मैंने सत्यापनकर्ता का उपयोग करने की कोशिश की, और यह एक त्रुटि फेंक रहा है जिसे मैं समझ नहीं पा रहा हूं। मैंने इसके लिए एक अलग धागा बनाया है (http://stackoverflow.com/questions/8761930/jaxb-unmarshal- validation-throws-cvc-elt-1-cannot-find-the-declaration-of-eleme)। यदि आप कुछ भी सुझाव दे सकते हैं, तो मैं इसकी सराहना करता हूं। धन्यवाद। –

+0

दरअसल, यह अब तक का सबसे अच्छा तरीका है क्योंकि [अन्य दृष्टिकोण] (http://stackoverflow.com/a/10227684/1864054) बस अच्छे और/या उत्पादक परिणाम नहीं देते हैं। हालांकि, मैं परीक्षण संदेशों को उत्पन्न करने के लिए 'साबुनयूआई' का उपयोग करने के खिलाफ अनुशंसा करता हूं क्योंकि यह किसी भी (नकली) डेटा मानों के बिना संदेश कंकाल उत्पन्न करता है, जो आपको त्रुटि प्रवणता, विशेष रूप से बड़े संदेशों के लिए मैन्युअल रूप से टाइप करने के लिए मजबूर करता है। इसके बजाय, अल्टोवा का XMLSpy चमत्कार करता है। आपको बस इतना करना है कि 'एसओएपी' मेनू से 'नया एसओएपी अनुरोध बनाएं' आइटम चुनें और वॉयला !, आपको पूरी तरह से काम कर रहा है (नकली) संदेश। – Withheld

10
JAXBContext context = JAXBContext.newInstance(jaxbObjectClass); 
Unmarshaller unmarshaller = context.createUnmarshaller(); 
unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler()); 
+1

इस कोड स्निपेट के सवाल के जवाब के बारे में एक टिप्पणी या दो सहायक हो। DefaultValidationEventHandler पुराना JAXB 1.0 हैंडलर है - है ना? क्या आप इसे एक उत्तर के रूप में सुझाव दे रहे हैं क्योंकि पुराना हैंडलर अधिक वर्बोज़ त्रुटि संदेशों को थूक देगा? – Ryan

+0

javadocs से: सार्वजनिक वर्ग DefaultValidationEventHandler वस्तु लागू करता ValidationEventHandler JAXB 1.0 केवल डिफ़ॉल्ट सत्यापन ईवेंट हैंडलर फैली हुई है। यह एक JAXBContext से बनाई गई सभी ऑब्जेक्ट्स के लिए डिफ़ॉल्ट हैंडलर है जो एक जेएक्सबी 1.0 बाध्यकारी कंपाइलर द्वारा उत्पन्न स्कीमा-व्युत्पन्न कोड का प्रबंधन कर रहा है। यह हैंडलर पहली त्रुटि या घातक त्रुटि पर असम्बद्ध और मान्य संचालन विफल होने का कारण बनता है। – superbAfterSemperPhi

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