2015-12-21 11 views
5

मैं एक रेपो की स्थापना मार्शल unmarshal नहीं किया जा सकता जो मेरी समस्या पता चलता है:दस्तावेज़ जब इस्तेमाल किया डिफ़ॉल्ट नाम स्थान

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<for:document xmlns:for="http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx"> 
    <Export xmlns="urn:adcubum:Syrius"> 
     <ExportInhalt/> 
     <ExportKopf> 
      <Quelle>lokal</Quelle> 
     </ExportKopf> 
     <SchemaVersion>bec811a9807a8c8da403d70b9b5e22ad</SchemaVersion> 
    </Export> 
</for:document> 

इस दस्तावेज़ को मैं मिलता है: https://github.com/Waxolunist/stackoverflow.34392476

मैं एक सरल एक्सएमएल दस्तावेज़ unmarshal करने की कोशिश निम्नलिखित कोड से:

Document document = new Document(); 
    Export export = new Export(); 
    ExportKopf exportKopf = new ExportKopf(); 
    exportKopf.setQuelle("lokal"); 
    export.setExportKopf(exportKopf); 
    ExportInhalt exportInhalt = new ExportInhalt(); 
    export.setExportInhalt(exportInhalt); 
    export.setSchemaVersion("bec811a9807a8c8da403d70b9b5e22ad"); 
    document.setExport(export); 

    JAXBContext jaxbContext = JAXBContext.newInstance(Document.class); 
    Marshaller marshaller = jaxbContext.createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
    marshaller.marshal(document, System.out); 

दस्तावेज़ के रूप में निम्नानुसार है:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name = "document", namespace = "http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx") 
public class Document { 

    @XmlElement(name = "Export", namespace = "urn:adcubum:Syrius") 
    private vo.dom.common_service.modul_bl.syrius.Export export; 

} 

package-info.java

@XmlSchema(
namespace = "urn:adcubum:Syrius", 
xmlns = { 
    @XmlNs(prefix = "for", namespaceURI = "http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx"), 
    @XmlNs(prefix = "", namespaceURI = "urn:adcubum:Syrius") 
}, 
elementFormDefault = XmlNsForm.UNQUALIFIED) 

डेटा जब मैंने इसे unmarshal करने की कोशिश, मैं नहीं मिलता मैप किया गया:

JAXBContext jaxbContext = JAXBContext.newInstance(Document.class); 
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 

    InputStream is = this.getClass().getResourceAsStream("/requests/document_simple3.xml"); 
    XMLInputFactory factory = XMLInputFactory.newInstance(); 
    XMLStreamReader xmlsr = factory.createXMLStreamReader(is); 

    Document document = unmarshaller.unmarshal(xmlsr, Document.class).getValue(); 

ExportKopf और ExportInhalt अशक्त लौट रहे हैं।

इसके बजाय xml काम करता है। केवल अंतर ही नामस्थान उपसर्ग है:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<for:document xmlns:for="http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx"> 
    <ns3:Export xmlns:ns3="urn:adcubum:Syrius"> 
     <ExportInhalt/> 
     <ExportKopf> 
      <Quelle>lokal</Quelle> 
     </ExportKopf> 
     <SchemaVersion>bec811a9807a8c8da403d70b9b5e22ad</SchemaVersion> 
    </ns3:Export> 
</for:document> 

मैं eclipselink moxy का उपयोग कर रहा हूं।

मुझे क्या बदलना है, ताकि मार्शल दस्तावेज़ काम को अनमोल किया जा सके।

उत्तर

4

मुझे लगता है कि जब भी JAXB में ऐसा कुछ अजीब हो रहा है, तो मैपिंग के वास्तविक एक्सएसडी स्कीमा को देखना हमेशा अच्छा विचार है। आप आसानी से निम्नलिखित कोड के साथ ऐसा कर सकते हैं।

JAXBContext jaxbContext = JAXBContext.newInstance(Document.class); 
jaxbContext.generateSchema(new SchemaOutputResolver() { 

    @Override 
    public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException { 
     StreamResult streamResult = new StreamResult(new PrintWriter(System.err) { 
      @Override 
      public void close() { 
      } 
     }); 
     streamResult.setSystemId(suggestedFileName); 
     return streamResult; 
    } 
}); 

कि स्कीमा (रों) है कि आपके JAXB मॉडल को प्रदर्शित करना चाहिए (यदि आप किसी अन्य लेखक का उपयोग कर सकते उन्हें एक फ़ाइल पर लिखने में) प्रिंट होगा। एक्सएसडी फाइलें आमतौर पर इस तरह के मुद्दों के बारे में बहुत खुलासा करती हैं। मुझे लगता है कि आपके मामले में समस्या @XmlSchema मैपिंग है। आपको इसके बजाय elementFormDefault = XmlNsForm.QUALIFIED का उपयोग करने का प्रयास करना चाहिए। जब भी आप अपने मानचित्रण में एकाधिक नामस्थानों के साथ काम कर रहे हों तो QUALIFIED का उपयोग करना हमेशा अच्छा विचार है।

संपादित: जबकि अपनी JAXB मानचित्रण के साथ मुख्य समस्या elementFormDefault के लिए गलत और/या लापता मूल्य था वहाँ अन्य चीजें हैं जो अपने काम करने के लिए रेपो में कोड के लिए तय किया करनी पड़ती थी।

  • Document में Export तत्व एक नाम स्थान घोषणा याद आ रही थी के लिए export पैकेज
  • गलत नाम स्थान मूल्य से elementFormDefault = XmlNsForm.QUALIFIED लापता
  • (अपने उदाहरण से, Document और Export तत्वों विभिन्न नामस्थान के हिस्से हैं) अपने मुख्य पैकेज @XmlSchema एनोटेशन (urn:stackoverflow:exportnamespaceurn:stackoverflow:documentnamespace के बजाय Document तत्व होना चाहिए)
  • के लिए गलत आयात- यह model.sun.Document
+0

मैं भी GitHub रेपो में अपने कोड तय है, ताकि आप इसे पा सकते हैं इसके लिए एक पुल का अनुरोध किया। यहां मेरा क्लोन है: https://github.com/nfekete/stackoverflow.34392476/commit/3b980248b05403a51b9b53c90176bc5361772b9a –

+0

यह प्रश्न आपको 'elementFormDefault': http: // stackoverflow के योग्य योग्य बनाम अयोग्य मूल्य के साथ मदद कर सकता है।कॉम/प्रश्न/1463138/क्या-करता-elementformdefault-do-for-xml-when-is-it-used- –

+0

आपके काम के लिए धन्यवाद। यह मदद करता है। – Christian

1

संपादित करने के बजाय model.eclipselink.Document का आयात किया गया था: यहाँ अद्यतन कोड https://github.com/MojoJojo/stackoverflow.34392476

ठीक है, यहाँ सब moxy_jaxb परीक्षण गुजर के साथ काम कर संस्करण है। चूंकि आपने कहा है कि आप moxy का उपयोग कर रहे हैं, मैंने model.sun। * संकुल के लिए परिवर्तन छोड़े हैं। यदि आप नीचे दी गई अवधारणा को समझते हैं, तो आप इसे आसानी से ठीक करने में सक्षम होना चाहिए।

सबसे पहले, मैंने आपके मोड में नेमस्पेस घोषणाएं साफ़ की हैं। * पैकेज। अधिकांश समय, पैकेज-info.java के अंदर घोषणाओं और बाइंडिंग पर्याप्त है। उन्हें पैकेज, इकाइयों, क्षेत्रों पर बार-बार घोषित करना जटिलता और अवांछित व्यवहार में शामिल होगा। विवरण के लिए this link देखें। अलग-अलग मॉडल/संस्थाओं पर खुद को फिर से घोषित करने की आवश्यकता नहीं है, जब तक कि अन्यथा करने का कोई मजबूत कारण न हो। इसके बाद, परीक्षण एक्सएमएल स्वयं थोड़ा टूटा हुआ था। फिक्स्ड उचित उपसर्गों के साथ परीक्षण एक्सएमएल जहां आवश्यक:

पहले, model.eclipselink.Document.java

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name = "document") 
public class Document { 
    @XmlElement(name = "Export", namespace="urn:adcubum:Syrius") 
    private Export export; 
    public Export getExport() { 
     return export; 
    } 
    public void setExport(Export export) { 
     this.export = export; 
    } 
} 

model.eclipselink.package-info.java:

@XmlSchema(namespace = "http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx", 
elementFormDefault = XmlNsForm.QUALIFIED) 
package model.eclipselink; 

import javax.xml.bind.annotation.XmlNs; 
import javax.xml.bind.annotation.XmlNsForm; 
import javax.xml.bind.annotation.XmlSchema; 

इसी रिफैक्टरिंग पर model.eclipselink.export.packageinfo.java:

@XmlSchema(namespace = "urn:adcubum:Syrius", 
elementFormDefault = XmlNsForm.QUALIFIED) 
package model.eclipselink.export; 
import javax.xml.bind.annotation.XmlNs; 
import javax.xml.bind.annotation.XmlNsForm; 
import javax.xml.bind.annotation.Xml 

और Export.java पर:

package model.eclipselink.export; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 

import org.eclipse.persistence.oxm.annotations.XmlElementNillable; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name = "Export") 

@XmlType(name = "Export", propOrder = { 
     "exportInhalt", 
     "exportKopf", 
     "schemaVersion" 
    }) 
public class Export { 

    @XmlElement(name = "ExportKopf", required = true) 
    private ExportKopf exportKopf; 

    @XmlElement(name = "ExportInhalt", required = true) 
    private ExportInhalt exportInhalt; 

    @XmlElement(name = "SchemaVersion", required = true) 
    private String schemaVersion; 

    public ExportKopf getExportKopf() { 
     return exportKopf; 
    } 

    public void setExportKopf(ExportKopf exportKopf) { 
     this.exportKopf = exportKopf; 
    } 

    public ExportInhalt getExportInhalt() { 
     return exportInhalt; 
    } 

    public void setExportInhalt(ExportInhalt exportInhalt) { 
     this.exportInhalt = exportInhalt; 
    } 

    public String getSchemaVersion() { 
     return schemaVersion; 
    } 

    public void setSchemaVersion(String schemaVersion) { 
     this.schemaVersion = schemaVersion; 
    } 

} 

और prefixes.Here के document_prefix.xml के लिए अपने एक्सएमएल फ़ाइलें करने के लिए कुछ बदलाव

<?xml version="1.0" encoding="UTF-8"?> 
<for:document xmlns:for="http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx"> 
    <ns1:Export xmlns:ns1="urn:adcubum:Syrius"> 
     <ns1:ExportKopf> 
      <ns1:Quelle>lokal</ns1:Quelle> 
     </ns1:ExportKopf> 
     <ns1:ExportInhalt/> 
     <ns1:SchemaVersion>bec811a9807a8c8da403d70b9b5e22ad</ns1:SchemaVersion> 
    </ns1:Export> 
</for:document> 

document.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<for:document 
    xmlns:for="http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx" xmlns="urn:adcubum:Syrius"> 
    <Export> 
     <ExportKopf> 
      <Quelle>lokal</Quelle> 
     </ExportKopf> 
     <ExportInhalt /> 
     <SchemaVersion>bec811a9807a8c8da403d70b9b5e22ad</SchemaVersion> 
    </Export> 
</for:document> 

और document_realnamespace.xml (सुनिश्चित नहीं हैं कि उद्देश्य इस फ़ाइल का है):

<?xml version="1.0" encoding="UTF-8"?> 
<for:document xmlns:ns1="urn:adcubum:Syrius" xmlns:for="http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx"> 
    <ns1:Export> 
     <ns1:ExportKopf> 
      <ns1:Quelle>lokal</ns1:Quelle> 
     </ns1:ExportKopf> 
     <ns1:ExportInhalt/> 
     <ns1:SchemaVersion>bec811a9807a8c8da403d70b9b5e22ad</ns1:SchemaVersion> 
    </ns1:Export> 
</for:document> 

और तुम mvn स्वच्छ परीक्षण चलाने:

Running moxy_jaxb.MarshallerTest 
Context class: class org.eclipse.persistence.jaxb.JAXBContext 
<?xml version="1.0" encoding="UTF-8"?> 
<document xmlns="http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrend 
erer/forwktbx" xmlns:ns0="urn:adcubum:Syrius"> 
    <ns0:Export> 
     <ns0:ExportInhalt/> 
     <ns0:ExportKopf> 
     <ns0:Quelle>lokal</ns0:Quelle> 
     </ns0:ExportKopf> 
     <ns0:SchemaVersion>bec811a9807a8c8da403d70b9b5e22ad</ns0:SchemaVersion> 
    </ns0:Export> 
</document> 
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.044 sec 
Running moxy_jaxb.UnmarshallerTest 
Context class: class org.eclipse.persistence.jaxb.JAXBContext 
lokal 
Context class: class org.eclipse.persistence.jaxb.JAXBContext 
lokal 
Context class: class org.eclipse.persistence.jaxb.JAXBContext 
lokal 
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.033 sec 
संबंधित मुद्दे