JAXB (un) сортировка типов xsd: xsd: base64Binary и xsd: hexBinary - PullRequest
5 голосов
/ 17 ноября 2010

JAXB отображает оба типа xsd:base64Binary и xsd: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);

Как правильно обращаться с этими типами? Заранее спасибо.

1 Ответ

13 голосов
/ 14 декабря 2010

Преобразование между байтом [] и представлением hexBinary или base64Binary выполняется через соответствующий XmlAdapter.

по умолчанию JAXB использует включенный HexBinaryAdapter для преобразования байта [] в строку. Я не знаю, есть ли XmlAdapter, который конвертирует из / в base64, но это не проблема:

Вы можете легко реализовать это самостоятельно, используя собственный 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 };

}
...