5

JAXB 将xsd:base64Binaryxsd:hexBinary类型都映射到byte[].

鉴于我有一个模式/一个 DOM 元素代表这些类型中的每一个,例如:

<foo>ABCD</foo>对于 xsd:hexBinary 和
<foo>YTM0NZomIzI2OTsmIzM0NTueYQ==</foo>xsd:base64Binary ,

目前尚不清楚 JAXB 2.1 如何处理它。

JAXB.unmarshal(new DOMSource(node), byte[].class)不喜欢有效载荷。
以下内容也没有:

JAXBContext ctx = JAXBContext.newInstance(byte[].class); ctx.createUnmarshaller().unmarshal(node);

处理这些类型的正确方法是什么?提前致谢。

4

1 回答 1

13

byte[] 和 hexBinary 或 base64Binary 表示之间的转换是通过对应的 XmlAdapter 完成的。

默认情况下,JAXB 使用包含的HexBinaryAdapter将 byte[] 转换为字符串。我不知道是否还有一个从/转换为 base64 的 XmlAdapter 但这没问题:

您可以使用自己的 XmlAdpater 轻松实现它:

public final class Base64Adapter extends XmlAdapter<String, byte[]> {
    public byte[] unmarshal(String s) {
        if (s == null)
            return null;
        return org.apache.commons.codec.binary.Base64.decodeBase64(s);
    }

    public String marshal(byte[] bytes) {
        if (bytes == null)
            return null;
        return org.apache.commons.codec.binary.Base64.encodeBase64String(bytes);
    }
}

您可以在 field/getter_setter 级别上指定应该由哪个适配器处理:

private class DataTestClass {

    @XmlJavaTypeAdapter(Base64Adapter.class)
    public byte[] base64Data = new byte[] { 0, 1, 2, 3, 4 };

    @XmlJavaTypeAdapter(HexBinaryAdapter.class)
    public byte[] hexbinData = new byte[] { 0, 1, 2, 3, 4 };

}
于 2010-12-14T15:06:00.583 回答