JAXB: Wie passen Xml-Serialisierung von Doppel-Felder
Ich habe ein legacy-Klasse, mit einer Menge von public double Felder. Alle double-Felder werden initialisiert mit Double.MAX_VALUE
zu zeigen, dass Sie leer sind. (Das Erbe der Serialisierung kodiert wird, die zu ignorieren, die Feld-und nicht serialisieren, wenn das Feld entspricht Double.MAX_VALUE
).
Versuchen wir nun, die Serialisierung dieser Klasse, um Xml-Daten mit JAXB Marshaller. Es funktioniert gut, außer, dass wir verhindern wollen, dass das generieren von Xml für die Felder, die gleich Double.MAX_VALUE
.
Wir sind nicht mit einem separaten JAXB schema, nur markieren unsere Klassen mit verschiedenen javax.xml.bind.annotation
Anmerkungen. Wenn ein schema verwendet wird, können Sie ein <javaType>
- element zum angeben einer benutzerdefinierten Datentyp-Konverter. Gibt es eine Möglichkeit, dies zu tun mit Anmerkungen oder programmgesteuert?
Nach dem Versuch, Ansatz unten empfohlen, ich kann immer noch nicht XmlAdapter
abgeholt:
@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;
Meine top-level-Klasse ist: tta.eingraben.Daten.iserver.OrderBlotter, enthält eine Liste der tta.eingraben.Daten.iserver.OrderResponseWrappers die sich com.eztech.OrderResponse
. Alle double-Felder enthalten sind, in com.eztech.OrderResponse
.
Mein unit-test-code ist der folgende:
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());
Aber die double-Werte noch nicht bekommen, behandelt, indem die XmlAdapter
. Ich weiß, ich bin etwas fehlt einfach, aber ich bin mir nicht sicher, was es ist.
InformationsquelleAutor Sam Goldberg | 2010-11-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie einen XmlAdapter:
Der XmlAdapter
Das Modell-Objekt
Demo-Code
UPDATE
StaxMan s Vorschlag ist gut. Wenn Sie geben Sie die folgenden Paket-level-annotation können Sie vermeiden, die Notwendigkeit von individuell Kommentierung von allem die Doppelte Eigenschaften
package-info.java
Sie können auch hinzufügen @XmlAdapter Anmerkungen für Pakete (package-info.java können Anmerkungen enthalten!) -- überprüfen Sie heraus die java-docs. Das könnte, machen diesen Ansatz möglich
Ich aktualisiert meine Antwort zu gehören StaxMan Vorschlag.
Ich habe versucht, diesen Ansatz, wie es scheint, was gebraucht wird. Aber es scheint, dass die XmlJavaTypeAdapter Anmerkung habe ich es nicht abgeholt wird bei der Serialisierung. Ich denke, dass es vielleicht, weil die Felder, die enthalten sind in einer Klasse definiert, die in einem anderen package (außerhalb von unserem Projekt). Aber wirklich, ich bin mir nicht sicher, warum es nicht abgeholt wird.
Solange diese Klassen sind in Ihrer JAXBContext Sie sollten in Ordnung sein. Sie können auch prüfen wollen, EclipseLink JAXB (MOXy), ich bin der tech-Blei: eclipse.org/eclipselink/moxy.php
InformationsquelleAutor bdoughan
Schreiben Sie eine getter, gibt null zurück, statt Doppel.MAX_VALUE? (wenn der Typ "double", ändern müssen Sie es auf 'Double' zuerst, damit null-Werte).
Seit JAXB standardmäßig ignoriert schreiben von Nullen, das sollte das erreichen, was Sie zu tun versuchen. Dies setzt Voraus, Sie ändern können die legacy-Klasse in Frage stellen.
InformationsquelleAutor StaxMan