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);
    }
}

フィールド/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 に答える