10 Stimmen

JAXB nicht unmarshalling xml jedes Element zu JAXBElement

Ich habe einen Webservice-Aufruf. In meiner Antwort, wenn ich versuche, die xml zu erhalten any Element in ein JAXBElement umwandelt, tritt ein Fehler auf.

In dem Schema habe ich:

<xs:complexType name="InputType">
    <xs:annotation></xs:annotation>
    <xs:sequence>           
        <xs:element name="Id" type="xs:string" />
        <xs:any namespace="##any" processContents="lax" minOccurs="0" />
    </xs:sequence>
</xs:complexType>

Der von mir verwendete Code:

Object obj = inputType.getAny();
Object o = ((JAXBElement)obj).getValue(); 

Diese Zeile löst den Fehler aus: org.apache.xerces.dom.ElementNSImpl incompatible with javax.xml.bind.JAXBElement Fehler in der Soap-Oberfläche.

Warum lässt es sich nicht in JAXBElement umwandeln? Wie kann ich es zum Laufen bringen?

10voto

bdoughan Punkte 144925

Wenn die Eigenschaft mit dem folgenden annotiert ist, wird der Inhalt als DOM-Knoten abgebildet:

@XmlAnyElement

Wenn das Flag lax=true gesetzt ist, werden bekannte Elemente in Domänenobjekte umgewandelt:

@XmlAnyElement(lax=true)

Für weitere Informationen über @XmlAnyElement siehe:


UPDATE #1

Mit lax=true können Sie eine Mischung aus Domänenobjekten und DOM-Knoten erhalten. Das Folgende stammt aus den Java-Dokumenten:

Wenn wahr

Wenn wahr, wenn ein Element mit einer Eigenschaft übereinstimmt, die mit XmlAnyElement ist JAXBContext bekannt bekannt ist (zum Beispiel gibt es eine Klasse mit XmlRootElement, die den gleichen Tag Namen hat, oder es gibt XmlElementDecl, das den gleichen Tag-Namen hat), wird der Unmarshaller wird eifrig unmarshal dieses Element an das JAXB-Objekt, anstatt es in DOM zu unmarshallieren. Zusätzlich, wenn das Element unbekannt ist unbekannt ist, aber einen bekannten xsi:type hat, der Unmarshaller eifrig unmarshalling das Element in ein JAXBElement, mit dem unbekannten Elementnamen und der JAXBElement-Wert wird auf eine Instanz des JAXB-Mappings des bekannten xsi:type.

Infolgedessen wird nach dem Unmarshalling, kann die Eigenschaft heterogen werden; sie kann sowohl DOM-Knoten als auch einige JAXB-Objekte gleichzeitig enthalten.


UPDATE #2

Um das Problem letztendlich zu lösen:

  1. Da es möglich ist, dass diese Eigenschaft einen DOM-Knoten enthält, sollte Ihr Code diese Möglichkeit berücksichtigen, indem er eine Typenprüfung durchführt.
  2. Um die Menge der empfangenen DOM-Knoten zu reduzieren, müssen Sie die möglichen Root-Elemente dieser Fragmente mit Java-Klassen assoziieren. Dies geschieht durch Annotation von Klassen mit @XmlRootElement(name="foo", namespace="bar") oder mit @XmlElementDecl.

In meinem Blog finden Sie ein Beispiel dafür:

1voto

x.509 Punkte 2175

Validieren Sie Ihre XML-Datei anhand Ihres Schemas. Das sollte als Erstes überprüft werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X