2015-12-21 8 views
5
verwendet

ich ein Repo eingerichtet, das zeigt mein Problem: https://github.com/Waxolunist/stackoverflow.34392476Kann nicht Dokument vermarshallten Abstellungs wenn Standard-Namespace

Ich versuche, ein einfaches XML-Dokument zu entpacken:

<?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> 

Dies ist das Dokument, das ich bekommen aus folgenden Code:

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); 

Dokument sieht wie folgt aus:

@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) 

Wenn ich versuche, es zu entpacken, ich habe nicht die abgebildeten Daten:

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 und ExportInhalt zurückkehren null.

Stattdessen folgende XML funktioniert. Der einzige Unterschied ist der Namespace-Präfix:

<?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> 

Ich benutze Eclipselink Moxy.

Was muss ich ändern, damit das Marshalled-Dokument entpackt wird?

Antwort

4

Ich denke, es ist immer eine gute Idee, das tatsächliche XSD-Schema Ihres Mappings zu sehen, wenn etwas seltsames wie dieses in JAXB passiert. Sie könnten das mit dem folgenden Code leicht tun.

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; 
    } 
}); 

, dass das Schema gedruckt wird (en), die Ihre JAXB Modell widerspiegeln sollte (Sie einen anderen Schriftsteller verwenden können sie in eine Datei zu schreiben). Die XSD-Dateien sind in der Regel sehr aufschlussreich über diese Art von Problemen. Ich denke, das Problem in Ihrem Fall ist die @XmlSchema Zuordnung. Sie sollten stattdessen versuchen, elementFormDefault = XmlNsForm.QUALIFIED zu verwenden. Es ist immer eine gute Idee, QUALIFIED zu verwenden, wenn Sie mit mehreren Namespaces in Ihrem Mapping arbeiten.

EDIT: während das Hauptproblem mit Ihrem JAXB-Mapping der falsche und/oder fehlender Wert für die elementFormDefault gibt es andere Dinge war, die für den Code in Ihrem Repo fixiert werden mußte zu arbeiten.

  • das Export Element im Document wurde eine Namensraum-Deklaration fehlt (von Ihrem Beispiel der Document und Export Elemente sind Teile verschiedenen Namensräume)
  • elementFormDefault = XmlNsForm.QUALIFIED vom export Paket
  • falscher Namespace-Wert fehlen für Ihre Hauptpaket @XmlSchema Annotation (war urn:stackoverflow:exportnamespace anstelle von urn:stackoverflow:documentnamespace in dem das Document Element sollte sein)
  • falsche Import für jdk_jaxb/UnmarshallerTest.java - es war die model.eclipselink.Document statt model.sun.Document
+0

ich Ihren Code in der GitHub Repo-Fest für sie auch, einen Pull-Request, so dass Sie es finden können. Hier ist mein Klon: https://github.com/nfekete/stackoverflow.34392476/commit/3b980248b05403a51b9b53c90176bc5361772b9a –

+0

Diese Frage kann Ihnen mit dem qualifizierten vs unqualifizierten Wert für die 'ElementFormDefault' helfen: http: // stackoverflow.com/questions/1463138/was-ist-elementformdefault-do-for-xml-wenn-ist-es-verwendet –

+0

Vielen Dank für Ihre Arbeit. Es hilft. – Christian

1

EDIT importieren: Hier ist der aktualisierte Code https://github.com/MojoJojo/stackoverflow.34392476

Okay, hier ist die Arbeitsversion mit allen moxy_jaxb Test bestanden. Weil Sie sagten, dass Sie moxy verwenden, habe ich die Änderungen für model.sun. * - Pakete weggelassen. Wenn Sie das untenstehende Konzept verstehen, sollten Sie es leicht selbst beheben können.

Zuerst räumte ich Namespace-Deklarationen in Ihrem Modus. * Pakete. Meistens reichen die Deklarationen und Bindings in package-info.java aus. Wenn Sie sie immer wieder auf Paketen, Entitäten oder Feldern deklarieren, wird das zu Komplexität und unerwünschtem Verhalten beitragen. Weitere Informationen finden Sie unter this link. Es besteht keine Notwendigkeit, sie für die einzelnen Modelle/Entitäten selbst erneut zu deklarieren, es sei denn, es gibt einen starken Grund, etwas anderes zu tun. Als nächstes war das Test-XML selbst ein wenig kaputt. Feste des Test xml mit dem richtigen Präfixen wo nötig:

Zuerst 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; 

ähnlicher Refactoring auf 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 

Und auf 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; 
    } 

} 

Und die paar Veränderungen auf Ihre XML-Dateien für prefixes.Here des 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> 

und document_realnamespace.xml (nicht sicher, was der Zweck dieser Datei ist):

Und Sie laufen mvn sauber Test:

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