J'ai une classe héritée, avec beaucoup de doubles champs publics. Tous les champs doubles sont initialisés avec Double.MAX_VALUE
pour indiquer qu'ils sont vides. (La sérialisation héritée est codée pour ignorer le champ et non sérialiser si le champ est égal à Double.MAX_VALUE
).JAXB: Comment personnaliser la sérialisation Xml de champs doubles
Nous essayons maintenant de sérialiser cette classe en Xml en utilisant JAXB Marshaller. Cela fonctionne bien, sauf que nous voulons empêcher la génération de Xml pour les champs qui correspondent à Double.MAX_VALUE
.
Nous n'utilisons pas de schéma JAXB séparé, mais marquons simplement nos classes avec diverses annotations javax.xml.bind.annotation
. Si un schéma est utilisé, vous pouvez ajouter un élément <javaType>
pour spécifier un convertisseur DataType personnalisé. Est-il possible de faire cela en utilisant Annotations ou par programmation?
Après avoir essayé l'approche recommandée ci-dessous, je ne peux toujours pas XmlAdapter
ramassé:
@XmlJavaTypeAdapters({
@XmlJavaTypeAdapter(value=EmptyDoubleValueHandler.class, type=Double.class), @XmlJavaTypeAdapter(value=EmptyDoubleValueHandler.class, type=double.class)})
package tta.penstock.data.iserver;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
Ma première classe de niveau est: tta.penstock.data.iserver.OrderBlotter, qui contient une liste de TTA. penstock.data.iserver.OrderResponseWrappers qui s'étend com.eztech.OrderResponse
. Tous les champs doubles sont contenus dans com.eztech.OrderResponse
.
Mon code de test unitaire effectue les opérations suivantes:
JAXBContext context = JAXBContext.newInstance(new Class[] { OrderBlotter.class, OrderResponseWrapper.class, OrderResponse.class});
Marshaller marshaller = context.createMarshaller();
StringWriter stringWriter = new StringWriter();
marshaller.marshal(blotter, stringWriter);
System.out.println("result xml=\n" + stringWriter.toString());
Mais les doubles valeurs ne sont pas encore traitées par le XmlAdapter
. Je sais qu'il me manque quelque chose de basique, mais je ne suis pas sûr de ce que c'est.
Je regardais cette approche.Le problème est qu'il serait problématique de marquer tous les champs doubles dans la classe héritée. Je cherchais un "hook" global où l'on pourrait spécifier ou mettre exactement le type d'adaptateur de type que vous listez ci-dessus. C'est-à-dire quelque chose qui dit "pour chaque champ double dans cette classe, utilisez ce XmlAdapter". –
Vous pouvez également ajouter des annotations @XmlAdapter pour les paquets (package-info.java peut contenir des annotations!) - vérifiez les docs java. Cela pourrait rendre cette approche possible – StaxMan
J'ai mis à jour ma réponse pour inclure la suggestion de StaxMan. –