У меня есть унаследованный класс с множеством общедоступных двойных полей. Все двойные поля инициализируются с помощью Double.MAX_VALUE
, чтобы указать, что они пусты . (Унаследованная сериализация закодирована так, чтобы игнорировать поле и не сериализовать, если поле равно Double.MAX_VALUE
).
Сейчас мы пытаемся сериализовать этот класс в Xml с помощью JAXB Marshaller. Он работает нормально, за исключением того, что мы хотим предотвратить создание Xml для полей, которые равны Double.MAX_VALUE
.
Мы не используем отдельную схему JAXB, а просто размечаем наши классы различными javax.xml.bind.annotation
аннотациями. Если используется схема, вы можете добавить элемент
, чтобы указать настраиваемый преобразователь DataType. Есть ли способ сделать это с помощью аннотаций или программно?
Попробовав подход, рекомендованный ниже, я все еще не могу подобрать XmlAdapter
:
@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;
Мой класс верхнего уровня: tta.penstock. data.iserver.OrderBlotter, который содержит список tta.penstock.data.iserver.OrderResponseWrappers, который расширяет com.eztech.OrderResponse
. Все поля типа double содержатся в com.eztech.OrderResponse
.
Мой код модульного теста делает следующее:
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());
Но значения типа double по-прежнему не обрабатываются XmlAdapter
. Я знаю, что упускаю что-то базовое, но не знаю, что именно.