JAXB generischer @ XmlValue

8

Das Ziel besteht darin, das folgende XML mit JAXB

zu erstellen %Vor%

Gibt es eine Problemumgehung für generic @XmlValue Felder (ich muss byte[] und String data speichern)? Unten ist was ich begehre:

%Vor%

Aber ich bekomme diese Ausnahme

  

(*) IllegalAnnotationException:
  @ XmlAttribute / @ XmlValue muss auf einen Java-Typ verweisen, der Text in XML abbildet.

    
Johan Sjöberg 10.01.2012, 17:03
quelle

5 Antworten

8

Sie könnten eine XmlAdapter für diesen Anwendungsfall anstelle von @XmlValue verwenden:

BarAdapter

%Vor%

Foo

Die XmlAdapter ist mit der bars -Eigenschaft verknüpft, die die @XmlJavaTypeAdapter Annotation verwendet:

%Vor%

Leiste

%Vor%

Demo

Sie können dieses Beispiel mit dem folgenden Democode testen:

%Vor%

Ausgabe

Beachten Sie, wie die Ausgabe die Attribute xsi:type enthält, um den Typ des Werts beizubehalten. Sie können das Attribut xsi:type eliminieren, indem Sie XmlAdapter return String anstelle von Object verwenden. Wenn Sie dies tun, müssen Sie die Konvertierung von String in den entsprechenden Typ für die unmarshale Operation übernehmen:

%Vor%     
Blaise Doughan 17.01.2012, 21:30
quelle
4

Ich konnte nicht @XmlValue arbeiten, da ich immer NullPointerException auf dem Weg hatte - nicht sicher warum. Ich habe stattdessen etwas wie das folgende herausgefunden.

Lassen Sie Ihre Bar -Klasse vollständig fallen, da Sie, wie Sie wollen, alles enthalten können, können Sie es einfach mit Object darstellen.

%Vor%

Ohne JAXB mitzuteilen, welche Namespaces Ihre Typen verwenden, enthält jedes bar -Element in einem foo separate Namespace-Deklarationen und Stuff-das package-info.java und all das Namespace-Zeug dient nur Fancification nur.

%Vor%

Wenn Sie diesen einfachen Test ausführen, wird Ihrem XML-Code etwas ähnlich sein.

%Vor%

Ausgabe:

%Vor%     
Kohányi Róbert 17.01.2012 06:52
quelle
0

Gibt es einen Grund, warum Sie nicht einfach einen String mit Ihrem Byte [] konstruieren? Brauchst du wirklich ein Generikum?

    
Dylan Bijnagte 16.01.2012 04:35
quelle
0

Der Trick, den ich normalerweise verwende, ist, ein Schema mit den gewünschten Typen zu erstellen und dann xjc zu verwenden, um Java-Klassen zu generieren und zu sehen, wie Annotationen verwendet werden. :) Ich glaube in XML-Schema richtige Typ-Mapping für Byte [] ist 'base64Binary', so Schema wie folgt erstellen:

%Vor%

und Ausführen von xjc würden wir folgenden Code generiert bekommen:

%Vor%     
maximdim 18.01.2012 15:09
quelle
0

Ссылка könnte ein Duplikat sein, die Antwort hat jedoch zwei andere Optionen.

    
Oleksii 09.04.2015 14:33
quelle

Tags und Links