Есть ли способ указать Адаптер, который 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 в десятичном виде.Созданный класс Adapter отражает это должным образом:
public Integer unmarshal(String value) {
return (Integer.decode(value));
}
Однако, когда я хочу перенаправить значение обратно в элемент XML (который является литералом String), класс Adapter выполняет следующее:
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>