1

要将字节数组作为十六进制传递,我们可以使用:

@XmlElement
@XmlJavaTypeAdapter(HexBinaryAdapter.class)
private byte[] data;

我们如何传输十六进制格式的单个字节?使用以下代码它不起作用。当我尝试像这样阅读它时,我得到:HTTP Status 500 - Internal Server Error

@XmlAttribute
@XmlJavaTypeAdapter(HexBinaryAdapter.class)
private byte id;
4

1 回答 1

1

您可以执行以下操作:

XmlAdapter (字节适配器)

您可以创建自己的XmlAdapter在 aByte和所需的 hexBinary之间进行转换String

import javax.xml.bind.DatatypeConverter;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class ByteAdapter extends XmlAdapter<String, Byte> {

    @Override
    public Byte unmarshal(String v) throws Exception {
        return DatatypeConverter.parseHexBinary(v)[0];
    }

    @Override
    public String marshal(Byte v) throws Exception {
        return DatatypeConverter.printHexBinary(new byte[] {v});
    }

}

领域模型

为了XmlAdapter在所有JAXB (JSR-222)实现中工作,它需要放置在 type 的字段/属性上,Byte而不是byte. 在这个例子中,我们将Byte使用 JAXB 来创建字段并利用字段访问来保持 type 的属性byte。我们将利用@XmlSchemaType注解来指定对应的模式类型是hexBinary.

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {

    @XmlJavaTypeAdapter(ByteAdapter.class)
    @XmlSchemaType(name="hexBinary")
    public Byte bar;

    public byte getBar() {
        return bar;
    }

    public void setBar(byte bar) {
        this.bar = bar;
    }

}

演示

下面是一些您可以运行以证明一切正常的代码。

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum17483278/input.xml");
        Foo foo = (Foo) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(foo, System.out);
    }

}

输入.xml/输出

<?xml version="1.0" encoding="UTF-8"?>
<foo>
    <bar>2B</bar>
</foo>
于 2013-07-05T13:12:02.623 回答