Java 字节数组在JAXB类中不起作用

Java 字节数组在JAXB类中不起作用,java,jaxb,Java,Jaxb,我正在尝试像这样使用字节数组(JAXB类)。但是,即使我传递了有效字符,我也会在msg字段中获取所有0。已成功解析“id”和“myid”字段,但字节数组字段解析失败 @XmlRootElement(name = "testMessage") @XmlAccessorType(XmlAccessType.FIELD) public class TestMessage { @XmlAttribute private Integer id; @XmlElement(name

我正在尝试像这样使用字节数组(JAXB类)。但是,即使我传递了有效字符,我也会在msg字段中获取所有0。已成功解析“id”和“myid”字段,但字节数组字段解析失败

@XmlRootElement(name = "testMessage") @XmlAccessorType(XmlAccessType.FIELD) public class TestMessage { @XmlAttribute private Integer id; @XmlElement(name = "myid") private Long myid; @XmlElement(name = "msg") private byte[] msg; } @XmlRootElement(name=“testMessage”) @XmlAccessorType(XmlAccessType.FIELD) 公共类测试消息 { @XmlAttribute 私有整数id; @xmlement(name=“myid”) 私人长粘虫; @xmlement(name=“msg”) 专用字节[]msg; }
使用Java 1.6.023的JAXB,我获得了TestMessage实例的以下xml文件:

TestMessage testMessage = new TestMessage();
testMessage.id = 1;
testMessage.myid = 2l;
testMessage.msg = "Test12345678".getBytes();

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<testMessage id="1">
    <myid>2</myid>
    <msg>VGVzdDEyMzQ1Njc4</msg>
</testMessage>
TestMessage TestMessage=newtestmessage();
testMessage.id=1;
testMessage.myid=2l;
testMessage.msg=“Test12345678.getBytes();
2.
VgVzDyMzQ1NJC4
如果您解组此xml内容,则应返回TestMessage实例,其中包括msg字节数组(在xml文件中以base64编码)。

  • 您可以为字节数组xml元素使用xml适配器。正如您现在所看到的,每个元素都得到编组/解编组,并且适配器用于在编组/解编组时使用指定格式转换日期时间、类型转换等情况

  • HexBinaryAdapter类是属于javax.xml.bind.annotation.adapters的适配器之一,所以您可以使用它

    public class TestMessage {
        @XmlAttribute
        private Integer id;
    
        @XmlElement(name = "myid")
        private Long myid;
    
        @XmlJavaTypeAdapter(HexBinaryAdapter.class)
        @XmlElement(name = "msg")
        private byte[] msg;
    }
    
但是,如果您喜欢自定义转换,您可以创建自己的适配器,用于将字节转换为指定格式,如base64等

为此,您必须编写自己的解组/编组方法

public final class MyAdapter extends XmlAdapter<String, byte[]> {
    public byte[] unmarshal(String s) {
        if (s == null)
            return null;
        return decode()); // your way to decode.
    }

    public String marshal(byte[] bytes) {
        if (bytes == null)
            return null;
        return encode(); //your way to encode
    }
}

msg元素的XML模式数据类型是什么(它可能应该是十六进制或base64二进制?
    public class TestMessage {
        @XmlAttribute
        private Integer id;

        @XmlElement(name = "myid")
        private Long myid;

        @XmlJavaTypeAdapter(MyAdapter.class)
        @XmlElement(name = "msg")
        private byte[] msg;
    }