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:
Aber ich bekomme diese Ausnahme
(*) IllegalAnnotationException:
@ XmlAttribute / @ XmlValue muss auf einen Java-Typ verweisen, der Text in XML abbildet.
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:
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:
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.
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.
Wenn Sie diesen einfachen Test ausführen, wird Ihrem XML-Code etwas ähnlich sein.
%Vor%Ausgabe:
%Vor%Gibt es einen Grund, warum Sie nicht einfach einen String mit Ihrem Byte [] konstruieren? Brauchst du wirklich ein Generikum?
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%Tags und Links java xml generics jaxb marshalling