Есть ли способ указать адаптер, который 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>