JAXB - установить XmlAdapter только для определенного подтипа элемента? - PullRequest
6 голосов
/ 26 октября 2011

Мне нужно сгенерировать элемент xml, который может иметь в качестве значения любой «тип примитива» (xsd: string, xsd: boolean и т. Д.).Примеры:

<field xsi:type="xsd:string" name="aString">String Value</field>
<field xsi:type="xsd:dateTime" name="aDate">2011-10-21</field>
<field xsi:type="xsd:dateTime" name="aDateTime">2011-10-21T12:00:00</field>
...

Итак, я использую эту реализацию, которая заставляет JAXB определять xsi:type типа примитива:

public class Field {
    @XmlAttribute
    private String name;

    @XmlElement
    Object value;
}

, и она работает, как и ожидалось, но только для Java.util.Date получает тип xs:dateTime ...

Теперь я хочу изменить поведение маршаллера ТОЛЬКО тогда, когда объект 'value' является экземпляром java.util.Date для получения таких полей:

<field xsi:type="xsd:date" name="aDate">2011-10-21</field>
<field xsi:type="xsd:dateTime" name="aDateTime">2011-10-21T12:00:00</field>

Итак, я создаю адаптер, но если я попробую это:

@XmlElement
@XmlJavaTypeAdapter(DateAdapter.class)
Object value;

Адаптер должен обрабатывать java.lang.Object type

public class DateAdapter extends XmlAdapter<String, Object> {...}

Но я не хочу терять маршалеры JAXB для всех остальных объектов (Integer, Double и т. Д.) ...

есть ли способ установить адаптер для определенного подтипа элемента?

Ответы [ 2 ]

0 голосов
/ 01 сентября 2016

Я столкнулся с подобной ситуацией, хотя я приходил из XSD и генерировал оттуда классы. Тем не менее, решение должно быть переносимым и вам.

В моих случаях я хотел расширить использование простой String в модели XSD, чтобы она выступала в качестве кода UUID в коде Java, тогда другая была бы в качестве класса в других местах и ​​так далее. XML сторона, это все строка (xs: string), так как получить все эти строки в отдельные типы Java стороны ...

Что я закончил, так это то, что в XSD я создал простые типы для каждого случая, вот объявление UUID:

И используйте это вместо требуемой строки.

Затем я создал файл привязок, в котором я указал свои XmlAdaptors, как и вы, за исключением того, что теперь у меня есть отдельные цели, и поэтому я могу использовать несколько адаптеров, предназначенных специально для каждого типа XML.

Теперь у вас есть еще одна сложность в том, что на стороне Java представление вашего поля является просто объектом. Я полагаю, вы затем разыгрываете его, как только узнаете атрибут type. Возможно создание подкласса поля для каждого случая, это позволит вам изменить объявление typeADaptor.

0 голосов
/ 08 октября 2012

try

http://jaxb.java.net/guide/Mapping_interfaces.html#Use__XmlJavaTypeAdapter

XmlJavaTypeAdapter для интерфейсов с несколькими реализациями

...