有没有一种方法可以指定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工具运行模式时,应使用Integer.decode()作为值为0x1234或十进制4660的Integer来解码字符串“0x1234”。生成的Adapter类正确反射(reflect)了这一点:
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)的String值为“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>

最佳答案

试试这个

<jaxb:javaType name="int" parseMethod="Integer.decode"
                          printMethod="Integer.toHexString"/>

我还没有测试过,但是我记得使用了非常相似的东西。

07-26 09:01