Как сделать Я указываю адаптер (ы), которые JAXB использует для маршалинга / демаршалинга данных?

Есть ли способ указать адаптер, который JAXB использует для маршалинга / демаршалинга объектов в моей схеме XML?

Например, если Я хочу проанализировать следующее как целое число:

<SpecialValue>0x1234</SpecialValue>

Я могу использовать в своей схеме следующее:

<xs:simpleType name="HexInt">
    <xs:annotation> 
        <xs:appinfo>
            <jaxb:javaType name="int" parseMethod="Integer.decode" />
        </xs:appinfo>
    </xs:annotation>  
    <xs:restriction base="xs:string">
        <xs:pattern value="0x[0-9a-fA-F]+" />
    </xs:restriction>
</xs:simpleType>
<xs:element name="SpecialValue" type="HexInt" />

Когда я запускаю схему с помощью инструмента XJC, строка «0x1234» должна быть декодирована с помощью Integer.decode () как Целое число со значением 0x1234 или 4660 в десятичном формате. Сгенерированный класс адаптера правильно отражает это:

public Integer unmarshal(String value) {
    return (Integer.decode(value));
}

Однако, когда я хочу упорядочить значение обратно в элемент XML (который является строковым литералом), класс адаптера выполняет следующие действия:

public String marshal(Integer value) {
    if (value == null) {
        return null;
    }
    return value.toString();
}

В этом случае Строковое значение целого числа 0x1234 (4660 в десятичном формате) - «4660», что не соответствует моей схеме (потому что у него нет префикса «0x»).

Как я могу сообщить адаптеру, что я хочу, чтобы целое число 0x1234 было упорядочено как строковый литерал «0x1234»? Я хотел бы иметь возможность делать это в схеме, чтобы я мог просто создавать новые классы Java, не изменяя вывод. Возможно ли это?

Изменить: На основании принятого ответа, вот что я сделал, чтобы это заработало:

Я написал метод в классе com.example.Parse с именем toHexString ():

public static String toHexString(int value)
{
    return ("0x" + Integer.toHexString(value));
}

Затем я указал в схеме на этот метод печати:

<xs:simpleType name="HexInt">
    <xs:annotation> 
        <xs:appinfo>
            <jaxb:javaType name="int" parseMethod="Integer.decode" printMethod="com.example.Parse.toHexString" />
        </xs:appinfo>
    </xs:annotation>  
    <xs:restriction base="xs:string">
        <xs:pattern value="0x[0-9a-fA-F]+" />
    </xs:restriction>
</xs:simpleType>
9
задан troyal 11 May 2011 в 17:22
поделиться