Ana*_*and 5 xml xsd jaxb unmarshalling
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);
处理这些类型的正确方法是什么?提前致谢.
Rob*_*ert 13
byte []和hexBinary或base64Binary表示之间的转换是通过对应的XmlAdapter完成的.
默认情况下,JAXB使用包含的HexBinaryAdapter将byte []转换为String.我不知道是否还有一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在字段/ 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 };
}
Run Code Online (Sandbox Code Playgroud)