Я пытаюсь создать XmlAdapter
, который принимает XMLGregorianCalendar
и выводит XMLGregorianCalendar
. Цель состоит в том, чтобы просто удалить данные о часовом поясе из элемента при распаковке данных.
Он выглядит следующим образом:
public class TimezoneRemoverAdapter extends XmlAdapter<XMLGregorianCalendar, XMLGregorianCalendar> {
public XMLGregorianCalendar unmarshal(XMLGregorianCalendar xgc) {
if(xgc == null) {
return null;
}
xgc.setTimezone(DatatypeConstants.FIELD_UNDEFINED);
return xgc;
}
public XMLGregorianCalendar marshal(XMLGregorianCalendar xgc) {
return xgc;
}
}
Это отлично работает для следующего кода:
public class FooElement {
@XmlElement(name="bar-date")
@XmlJavaTypeAdapter(TimezoneRemoverAdapter.class)
@XmlSchemaType(name = "date")
protected XMLGregorianCalendar barDate;
}
К сожалению, когда я сгенерирую код с помощью файла jaxb-bindings.xml
, приведенный выше код выглядит следующим образом:
public class FooElement {
@XmlElement(name="bar-date", type=java.lang.String.class)
@XmlJavaTypeAdapter(TimezoneRemoverAdapter.class)
@XmlSchemaType(name = "date")
protected XMLGregorianCalendar barDate;
}
Он устанавливает тип String
, поэтому мой вышеописанный метод не работает. Тип String
переопределяет тип XMLGregorianCalendar
, который должен быть. Я могу изменить его вручную, но я бы не стал забывать обновлять его каждый раз, когда файлы jaxb восстанавливаются. Кто-нибудь знает, есть ли возможность вручную установить тип @XmlElement
или игнорировать его?
Ниже приведена соответствующая часть файла jaxb-bindings.xml
:
<jxb:bindings node=".//xs:element[@name=bar-date]">
<jxb:property>
<jxb:baseType>
<jxb:javaType name="javax.xml.datatype.XMLGregorianCalendar" adapter="foo.bar.TimezoneRemoverAdapter" />
</jxb:baseType>
</jxb:property>
</jxb:bindings>