___ answer13575019 ___

Sie können Ihr Objekt in eine Instanz von %code% einbinden, um die Informationen zum Stammelement bereitzustellen. Wenn Sie Ihr Modell aus einem XML-Schema generiert haben, gibt es hierfür bequeme Methoden auf der generierten %code% -Klasse.

Weitere Informationen

___ tag123jaxb ___ Java-Architektur für XML-Binding ist der Java-Standard für die Arbeit mit XML als Domänenobjekte. Es bietet einen einfachen Mechanismus zum Zuordnen von Java-Klassen zu XML-Darstellungen. ___ tag123marshalling ___ Marshalling ist der Prozess der Umwandlung der Speicherrepräsentation eines Objekts in ein Datenformat, das für die Speicherung oder Übertragung geeignet ist ___ answer49084070 ___

Sie können die Klasse ObjectFactory zur Umgehung der Klassen verwenden, für die das @XmlRootElement nicht verfügbar ist. ObjectFactory hat Methoden überladen, um es um das JAXBElement zu wickeln. Methode: 1 erstellt das Objekt einfach und Methode: 2 umschließt das Objekt mit @JAXBElement . Verwenden Sie immer Methode: 2 , um javax.xml.bind.MarshalException zu vermeiden - mit der verknüpften Ausnahme fehlt eine @ XmlRootElement-Annotation

Methode: 1

%Vor%

Methode: 2

%Vor%

hoffe, das ist hilfreich ...

    
___ qstntxt ___

Ich habe ein komplexes XML-Schema, das Teil eines internationalen Standards ist, daher kann ich die Schemadateien nicht ändern, und ich habe Maven benutzt, um daraus JAXB-Objekte zu generieren. Wenn ich versuche, Daten in meine JAXB-Objekte zu setzen und dann das Root-Element zu marshallen, erhalte ich den fehlenden @ XmlRootElement-Fehler bei mehreren der komplexen Typen. Meine Frage ist, wie kann ich das beheben? Umgebung:

  • JAXB 2.2.2
  • Maven 3.0.3
  • Eclipse Juno
  • Java 1.6
  • Windows 7 64 bit

Ich habe das Web und diese Seite ausführlich recherchiert, aber habe keine Antwort auf mein Problem gefunden, einschließlich dieses Posts: Ссылка

und diese Frage zum Stapelüberlauf: JAX-WS MarshalException mit benutzerdefinierten JAX-B-Bindungen: Der Typ "java.lang.String" kann nicht als Element marshaliert werden, da eine @ XmlRootElement-Annotation fehlt

Ich habe versucht, den fehlerhaften Klassen in meiner benutzerdefinierten Bindungsdatei eine Annotation hinzuzufügen, fügt der Klasse aber auch die Annotation sowie die Methode getContent () hinzu, und die Klasse wird nicht kompiliert. Ich denke nicht, dass ich diese Annotation sowieso hinzufügen müsste, da dies ein komplexer Typ ist, der eine Komponente der Wurzel ist, tatsächlich ist sie ziemlich tief in der Struktur verschachtelt. Ich habe gelesen, dass Sie das %code% -Tag dem globalen Bindeelement hinzufügen können, aber ich habe dem globalen Bindeelement eine Anzahl von Attributen hinzugefügt, und es wird nicht kompiliert, wenn ich das tue.

Kann mir jemand helfen, mich hier in die richtige Richtung zu lenken, könnte das ein Fehler in der Art sein, wie ich die JAXB-Objekte aufbaue? Ich habe es im Debugger durchlaufen und es scheint, dass, wenn die ArrayReferenceNodeProperty-Klasse aus dem Paket com.sun.xml.bind.v2.runtime.property versucht, den Listenkörper zu serialisieren und wenn es die JaxBeanInfo für diese Klassen bekommt, gibt es t ein dom handler set und der jaxbType ist kein Objekt, also denkt er, dass es ein root sein muss.

Ich verwende das nicht in einem webbasierten Dienst und abgesehen von den Optimierungen in der Bindungsdatei zum Beheben von Namenskonflikten wurden keine benutzerdefinierten Klassen oder Bindungen erstellt.

Hier ist die Top-Level-Schemadatei:

%Vor%

Für den xrefType setze ich nur zwei Attribute und für den refdmType setze ich nur einen anderen komplexen Typ ein, der Teil der ALLDMC-Gruppe ist. Der Code für die beiden komplexen Typen lautet:

%Vor%

Und hier ist der Hauptteil der von JAXB generierten Klassen. Ich habe die meisten Getter und Setter entfernt, um Platz zu sparen: Der RefdmType:

%Vor%

Der XrefType:

%Vor%

Und schließlich ist hier meine benutzerdefinierte Bindungsdatei:

%Vor%

Ein Überblick darüber, warum dies auftreten würde, und Vorschläge zur Behebung des Problems wären willkommen. Ich benutze JAXB nur für ein paar Monate und bin kein Experte. Danke.

Hier ist der Fehler, den ich sehe:

  

javax.xml.bind.MarshalException    - mit verknüpfter Ausnahme:   [com.sun.istack.SAXException2: kann den Typ "com.synesis7.s7exporter.domain.s1000d.dm.common.XrefType" nicht als Marshall-Element marshalieren, da eine @ XmlRootElement-Annotation fehlt]       unter com.sun.xml.bind.v2.runtime.MarshallerImpl.write (MarshallerImpl.java:323)       unter com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal (MarshallerImpl.java:249)       bei javax.xml.bind.helpers.AbstractMarshallerImpl.marshal (AbstractMarshallerImpl.java:96)       unter com.synesis7.s7exporter.client.s1000d.procedural.S7ProceduralRunnable.writeToXml (S7ProceduralRunnable.java:142)       unter com.synesis7.s7exporter.client.s1000d.procedural.S7ProceduralRunnable.createProceduralDm (S7ProceduralRunnable.java:118)       unter com.synesis7.s7exporter.client.s1000d.procedural.S7ProceduralRunnable.run (S7ProceduralRunnable.java:93)       unter com.synesis7.s7exporter.S7ExporterController.processProceduralDms (S7ExporterController.java:235)       unter com.synesis7.s7exporter.S7ExporterController.exportSchema (S7ExporterController.java:118)       bei com.synesis7.s7exporter.S7exporter.initializeExporter (S7exporter.java:58)       bei com.synesis7.s7exporter.S7exporter.main (S7exporter.java:38)   Verursacht von: com.sun.istack.SAXException2: kann den Typ "com.synesis7.s7exporter.domain.s1000d.dm.common.XrefType" nicht als Element marshallen, da eine @ XmlRootElement-Annotation fehlt       unter com.sun.xml.bind.v2.runtime.XMLSerializer.reportError (XMLSerializer.java:252)       unter com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot (ClassBeanInfoImpl.java:324)       unter com.sun.xml.bind.v2.runtime.property.ArrayReferenceNodeProperty.serializeListBody (ArrayReferenceNodeProperty.java:118)       unter com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody (ArrayERProperty.Java: 159)       unter com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody (ClassBeanInfoImpl.java:344)       unter com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType (XMLSerializer.java:700)       unter com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem (ArrayElementNodeProperty.java:69)       unter com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody (ArrayElementProperty.java:172)       unter com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody (ArrayERProperty.java:159)       unter com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody (ClassBeanInfoImpl.java:344)       unter com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType (XMLSerializer.java:700)       unter com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem (ArrayElementNodeProperty.java:69)       unter com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody (ArrayElementProperty.java:172)       unter com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody (ArrayERProperty.java:159)       unter com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody (ClassBeanInfoImpl.java:344)       unter com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType (XMLSerializer.java:700)       unter com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem (ArrayElementNodeProperty.java:69)       unter com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody (ArrayElementProperty.java:172)       unter com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody (ArrayERProperty.java:159)       unter com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody (ClassBeanInfoImpl.java:344)       unter com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType (XMLSerializer.java:700)       unter com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody (SingleElementNodeProperty.java:156)       unter com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody (ClassBeanInfoImpl.java:344)       unter com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType (XMLSerializer.java:700)       unter com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody (SingleElementNodeProperty.java:156)       unter com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody (ClassBeanInfoImpl.java:344)       unter com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody (ClassBeanInfoImpl.java:338)       unter com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType (XMLSerializer.java:700)       unter com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody (SingleElementNodeProperty.java:156)       unter com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody (ClassBeanInfoImpl.java:344)       unter com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType (XMLSerializer.java:700)       unter com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody (SingleElementNodeProperty.java:156)       unter com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl $ 1.serializeBody (ElementBeanInfoImpl.java:161)       bei com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl $ 1.serializeBody (ElementBeanInfoImpl.java:193)       unter com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody (ElementBeanInfoImpl.java:321)       unter com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot (ElementBeanInfoImpl.java:328)       unter com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot (ElementBeanInfoImpl.java:76)       unter com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot (XMLSerializer.java:498)       unter com.sun.xml.bind.v2.runtime.MarshallerImpl.write (MarshallerImpl.java:320)       ... 9 mehr

    
___

8

Ich habe ein komplexes XML-Schema, das Teil eines internationalen Standards ist, daher kann ich die Schemadateien nicht ändern, und ich habe Maven benutzt, um daraus JAXB-Objekte zu generieren. Wenn ich versuche, Daten in meine JAXB-Objekte zu setzen und dann das Root-Element zu marshallen, erhalte ich den fehlenden @ XmlRootElement-Fehler bei mehreren der komplexen Typen. Meine Frage ist, wie kann ich das beheben? Umgebung:

  • JAXB 2.2.2
  • Maven 3.0.3
  • Eclipse Juno
  • Java 1.6
  • Windows 7 64 bit

Ich habe das Web und diese Seite ausführlich recherchiert, aber habe keine Antwort auf mein Problem gefunden, einschließlich dieses Posts: Ссылка

und diese Frage zum Stapelüberlauf: JAX-WS MarshalException mit benutzerdefinierten JAX-B-Bindungen: Der Typ "java.lang.String" kann nicht als Element marshaliert werden, da eine @ XmlRootElement-Annotation fehlt

Ich habe versucht, den fehlerhaften Klassen in meiner benutzerdefinierten Bindungsdatei eine Annotation hinzuzufügen, fügt der Klasse aber auch die Annotation sowie die Methode getContent () hinzu, und die Klasse wird nicht kompiliert. Ich denke nicht, dass ich diese Annotation sowieso hinzufügen müsste, da dies ein komplexer Typ ist, der eine Komponente der Wurzel ist, tatsächlich ist sie ziemlich tief in der Struktur verschachtelt. Ich habe gelesen, dass Sie das <xjc:simple/> -Tag dem globalen Bindeelement hinzufügen können, aber ich habe dem globalen Bindeelement eine Anzahl von Attributen hinzugefügt, und es wird nicht kompiliert, wenn ich das tue.

Kann mir jemand helfen, mich hier in die richtige Richtung zu lenken, könnte das ein Fehler in der Art sein, wie ich die JAXB-Objekte aufbaue? Ich habe es im Debugger durchlaufen und es scheint, dass, wenn die ArrayReferenceNodeProperty-Klasse aus dem Paket com.sun.xml.bind.v2.runtime.property versucht, den Listenkörper zu serialisieren und wenn es die JaxBeanInfo für diese Klassen bekommt, gibt es t ein dom handler set und der jaxbType ist kein Objekt, also denkt er, dass es ein root sein muss.

Ich verwende das nicht in einem webbasierten Dienst und abgesehen von den Optimierungen in der Bindungsdatei zum Beheben von Namenskonflikten wurden keine benutzerdefinierten Klassen oder Bindungen erstellt.

Hier ist die Top-Level-Schemadatei:

%Vor%

Für den xrefType setze ich nur zwei Attribute und für den refdmType setze ich nur einen anderen komplexen Typ ein, der Teil der ALLDMC-Gruppe ist. Der Code für die beiden komplexen Typen lautet:

%Vor%

Und hier ist der Hauptteil der von JAXB generierten Klassen. Ich habe die meisten Getter und Setter entfernt, um Platz zu sparen: Der RefdmType:

%Vor%

Der XrefType:

%Vor%

Und schließlich ist hier meine benutzerdefinierte Bindungsdatei:

%Vor%

Ein Überblick darüber, warum dies auftreten würde, und Vorschläge zur Behebung des Problems wären willkommen. Ich benutze JAXB nur für ein paar Monate und bin kein Experte. Danke.

Hier ist der Fehler, den ich sehe:

  

javax.xml.bind.MarshalException    - mit verknüpfter Ausnahme:   [com.sun.istack.SAXException2: kann den Typ "com.synesis7.s7exporter.domain.s1000d.dm.common.XrefType" nicht als Marshall-Element marshalieren, da eine @ XmlRootElement-Annotation fehlt]       unter com.sun.xml.bind.v2.runtime.MarshallerImpl.write (MarshallerImpl.java:323)       unter com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal (MarshallerImpl.java:249)       bei javax.xml.bind.helpers.AbstractMarshallerImpl.marshal (AbstractMarshallerImpl.java:96)       unter com.synesis7.s7exporter.client.s1000d.procedural.S7ProceduralRunnable.writeToXml (S7ProceduralRunnable.java:142)       unter com.synesis7.s7exporter.client.s1000d.procedural.S7ProceduralRunnable.createProceduralDm (S7ProceduralRunnable.java:118)       unter com.synesis7.s7exporter.client.s1000d.procedural.S7ProceduralRunnable.run (S7ProceduralRunnable.java:93)       unter com.synesis7.s7exporter.S7ExporterController.processProceduralDms (S7ExporterController.java:235)       unter com.synesis7.s7exporter.S7ExporterController.exportSchema (S7ExporterController.java:118)       bei com.synesis7.s7exporter.S7exporter.initializeExporter (S7exporter.java:58)       bei com.synesis7.s7exporter.S7exporter.main (S7exporter.java:38)   Verursacht von: com.sun.istack.SAXException2: kann den Typ "com.synesis7.s7exporter.domain.s1000d.dm.common.XrefType" nicht als Element marshallen, da eine @ XmlRootElement-Annotation fehlt       unter com.sun.xml.bind.v2.runtime.XMLSerializer.reportError (XMLSerializer.java:252)       unter com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot (ClassBeanInfoImpl.java:324)       unter com.sun.xml.bind.v2.runtime.property.ArrayReferenceNodeProperty.serializeListBody (ArrayReferenceNodeProperty.java:118)       unter com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody (ArrayERProperty.Java: 159)       unter com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody (ClassBeanInfoImpl.java:344)       unter com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType (XMLSerializer.java:700)       unter com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem (ArrayElementNodeProperty.java:69)       unter com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody (ArrayElementProperty.java:172)       unter com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody (ArrayERProperty.java:159)       unter com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody (ClassBeanInfoImpl.java:344)       unter com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType (XMLSerializer.java:700)       unter com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem (ArrayElementNodeProperty.java:69)       unter com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody (ArrayElementProperty.java:172)       unter com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody (ArrayERProperty.java:159)       unter com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody (ClassBeanInfoImpl.java:344)       unter com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType (XMLSerializer.java:700)       unter com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem (ArrayElementNodeProperty.java:69)       unter com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody (ArrayElementProperty.java:172)       unter com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody (ArrayERProperty.java:159)       unter com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody (ClassBeanInfoImpl.java:344)       unter com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType (XMLSerializer.java:700)       unter com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody (SingleElementNodeProperty.java:156)       unter com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody (ClassBeanInfoImpl.java:344)       unter com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType (XMLSerializer.java:700)       unter com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody (SingleElementNodeProperty.java:156)       unter com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody (ClassBeanInfoImpl.java:344)       unter com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody (ClassBeanInfoImpl.java:338)       unter com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType (XMLSerializer.java:700)       unter com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody (SingleElementNodeProperty.java:156)       unter com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody (ClassBeanInfoImpl.java:344)       unter com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType (XMLSerializer.java:700)       unter com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody (SingleElementNodeProperty.java:156)       unter com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl $ 1.serializeBody (ElementBeanInfoImpl.java:161)       bei com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl $ 1.serializeBody (ElementBeanInfoImpl.java:193)       unter com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody (ElementBeanInfoImpl.java:321)       unter com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot (ElementBeanInfoImpl.java:328)       unter com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot (ElementBeanInfoImpl.java:76)       unter com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot (XMLSerializer.java:498)       unter com.sun.xml.bind.v2.runtime.MarshallerImpl.write (MarshallerImpl.java:320)       ... 9 mehr

    
Mitch McFarland 26.11.2012, 23:09
quelle

2 Antworten

19

Sie können Ihr Objekt in eine Instanz von JAXBElement einbinden, um die Informationen zum Stammelement bereitzustellen. Wenn Sie Ihr Modell aus einem XML-Schema generiert haben, gibt es hierfür bequeme Methoden auf der generierten ObjectFactory -Klasse.

Weitere Informationen

Blaise Doughan 26.11.2012, 23:34
quelle
0

Sie können die Klasse ObjectFactory zur Umgehung der Klassen verwenden, für die das @XmlRootElement nicht verfügbar ist. ObjectFactory hat Methoden überladen, um es um das JAXBElement zu wickeln. Methode: 1 erstellt das Objekt einfach und Methode: 2 umschließt das Objekt mit @JAXBElement . Verwenden Sie immer Methode: 2 , um javax.xml.bind.MarshalException zu vermeiden - mit der verknüpften Ausnahme fehlt eine @ XmlRootElement-Annotation

Methode: 1

%Vor%

Methode: 2

%Vor%

hoffe, das ist hilfreich ...

    
prasadg 03.03.2018 12:23
quelle

Tags und Links