2012-01-31 8 views
14

एक वेब सेवा एक वस्तु डबल्यूएसडीएल द्वारा परिभाषित लौटा रहा है होने के लिए:जेएक्सबी का उपयोग कर सेवा से लौटे 'anyType' से जावा ऑब्जेक्ट कैसे बनाया जाए?

<s:complexType mixed="true"><s:sequence><s:any/></s:sequence></s:complexType> 

जब मैं इस वस्तु की क्लास की जानकारी का प्रिंट आउट, यह रूप में आता है:

class com.sun.org.apache.xerces.internal.dom.ElementNSImpl 

लेकिन मैं इस unmarshall करने की जरूरत है निम्नलिखित वर्ग की एक वस्तु के रूप आपत्ति:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
     "info", 
     "availability", 
     "rateDetails", 
     "reservation", 
     "cancellation", 
     "error" }) 
@XmlRootElement(name = "ArnResponse") 
public class ArnResponse { } 

मैं जानता हूँ कि प्रतिक्रिया, सही है क्योंकि मुझे पता है कि मार्शल इस वस्तु के XML करने के लिए:

Marshaller m = jc.createMarshaller(); 
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
m.marshal(rootResponse, System.out); 

बाहर प्रिंट कौन सा:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns2:SubmitRequestDocResponse xmlns:ns2="http://tripauthority.com/hotel"> 
    <ns2:SubmitRequestDocResult> 
     <!-- below is the object I'm trying to unmarshall --> 
     <ArnResponse> 
      <Info /> 
      <Availability> 
       <!-- etc--> 
      </Availability> 
     </ArnResponse> 
    </ns2:SubmitRequestDocResult> 
</ns2:SubmitRequestDocResponse> 

मैं ElementNSImpl वस्तु मैं ArnResponse वस्तु मैं इसे का प्रतिनिधित्व करता है पता है में दिखाई दे रही है कैसे कर सकते हैं?

इसके अतिरिक्त, मैं ऐपइंजिन पर चल रहा हूं, जहां फ़ाइल का उपयोग प्रतिबंधित है।

किसी भी मदद

अद्यतन के लिए धन्यवाद:

मैं @XmlAnyElement(lax=true) एनोटेशन जोड़ दिया है तो तरह,:

@XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name = "", propOrder = { 
     "content" 
    }) 
    @XmlSeeAlso(ArnResponse.class) 
    public static class SubmitRequestDocResult { 

    @XmlMixed 
    @XmlAnyElement(lax = true) 
    protected List<Object> content; 

लेकिन यह कोई फर्क नहीं पड़ता।

क्या यह इस तथ्य के साथ कुछ करना है कि सामग्री List है?

यहाँ कोड है, जहां मैं सर्वर से इसे वापस प्राप्त करने के बाद सामग्री का उपयोग करने के लिए कोशिश कर रहा हूँ है:

List list = rootResponse.getSubmitRequestDocResult().getContent(); 

for (Object o : list) { 
    ArnResponse response = (ArnResponse) o; 
    System.out.println(response); 
} 

कौन सा आउटपुट है:

जनवरी 31, 2012 10:04: 14 AM com.districthp.core.server.ws.alliance.AllianceApi getRates गंभीर: com.sun.org.apache.xerces.internal.dom.ElementNSImpl com.districthp.core.server.ws में ढाला नहीं जा सकता है। alliance.response.ArnResponse

उत्तर:

axtavt के जवाब चाल किया था। यह काम किया:

Object content = ((List)result.getContent()).get(0); 
JAXBContext context = JAXBContext.newInstance(ArnResponse.class); 
Unmarshaller um = context.createUnmarshaller(); 
ArnResponse response = (ArnResponse)um.unmarshal((Node)content); 
System.out.println("response: " + response); 
+0

प्रतिक्रिया प्रतिक्रिया वस्तुओं और डब्लूएसडीएल के लिए मेरे पास सभी स्कीमा की प्रतियां हैं, अगर यह जानने में मदद मिलती है। – Cuga

+4

ध्यान दें कि यहां इस्तेमाल किया गया 'नोड' 'org.w3c.dom.Node' है। –

उत्तर

14

आप Unmarshaller.unmarshal(Node) को उस वस्तु पारित कर सकते हैं, यह इसके unmarshal में सक्षम होना चाहिए।

+0

अरे, यह काम किया। बहुत बहुत धन्यवाद! – Cuga

1

मैं क्या एक्सएमएल के साथ काम करने के साथ पाया है से, anyType किसी भी वस्तु का प्रतिनिधित्व कर सका, इसलिए निकटतम बात आप इसे वापस java.lang.Object है करने के लिए नक्शे कर सकते हैं। (उस तथ्य के अलावा कि anyType तकनीकी रूप से एक सुरक्षा छेद हो सकता है, जिससे किसी को किसी भी इंजेक्ट को इंजेक्ट करने की अनुमति मिलती है, जिसमें उस स्थान पर एक दुर्भावनापूर्ण बाइनरी भी शामिल है, और आपकी स्कीमा इसे अनुमति देने के बाद कुछ भी नहीं रुक जाएगी।)

आप अपनी स्कीमा को अपनी कस्टम ऑब्जेक्ट पर मैपिंग की अनुमति देने के लिए सबसे अच्छी तरह से बंद कर रहे हैं। यह एक प्रोग्रामिंग परिप्रेक्ष्य, एक खपत परिप्रेक्ष्य, और एक सुरक्षा परिप्रेक्ष्य दोनों से क्लीनर है।

लंबित आप ऐसा नहीं कर सकते हैं, मैं आपके तत्व की विशेषता के रूप में प्रकार को संग्रहीत करने की अनुशंसा करता हूं। anyType को उस ऑब्जेक्ट में कनवर्ट करने में आपकी सहायता के लिए आपको कस्टम कोड लिखने की आवश्यकता हो सकती है, लेकिन कम से कम आप इसके प्रकार को जानते हैं।

मेरे दो सेंट मेरे अनुभव से अधिक (ज्यादातर एकीकरण के दायरे में) के आधार पर।

+1

हाँ, अगर मैं कर सकता, तो मैं 'किसी भी प्रकार' का उपयोग नहीं करता, लेकिन हम किसी और की स्कीमा के साथ एकीकृत कर रहे हैं, इसलिए हम इसके साथ अटक गए हैं। – Cuga

4

आप @XmlAnyElement(lax=true) का उपयोग कर सकते हैं। यह डोमेन ऑब्जेक्ट्स में ज्ञात रूट तत्वों (@XmlRootElement या @XmlElementDecl) के साथ XML को परिवर्तित करेगा। एक उदाहरण के लिए देखें:

+1

मैंने चेक किया लेकिन एनोटेशन पहले से ही वहां था। कृपया मेरे अपडेट किए गए प्रश्न पर नज़र डालें। आपकी मदद के लिए फिर से धन्यवाद, और मैं आपके ब्लॉग पर पहले और आपके अन्य उत्तरों को SO पर यहां आया हूं। आपका काम पहले से ही मेरी मदद कर रहा है। – Cuga

+0

धन्यवाद, यह मेरी समस्या हल! –