JAXB Marshall字符串到base64

时间:2013-10-17 09:29:18

标签: java jaxb

我需要编组一个包含String变量的对象 String var。包含一个XML文档,它通过转义到XMLElement进行编组。

我想将String变量编组为base64格式,并在unmarshall上返回String。

这是可以的吗?

1 个答案:

答案 0 :(得分:7)

您可以使用XmlAdapter在编组/解组过程中将String转换为byte[]。默认情况下,JAXB将byte[]表示为base64Binary

XmlAdapter(Base64Adapter)

以下是XmlAdapter,可在Stringbyte[]之间进行转换。

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

public class Base64Adapter extends XmlAdapter<byte[], String> {

    @Override
    public String unmarshal(byte[] v) throws Exception {
        return new String(v);
    }

    @Override
    public byte[] marshal(String v) throws Exception {
        return v.getBytes();
    }

}

Java模型(Foo)

使用XmlAdapter注释配置@XmlJavaTypeAdapter

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

@XmlRootElement
public class Foo {

    private String bar;

    @XmlJavaTypeAdapter(Base64Adapter.class)
    public String getBar() {
        return bar;
    }

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

}

<强>演示

在下面的演示代码中,我们将创建一个Foo的实例并将其编组为XML。

import javax.xml.bind.*;

public class Demo {

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

        Foo foo = new Foo();
        foo.setBar("<abc>Hello World</abc>");

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

}

<强>输出

以下是运行演示代码的输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<foo>
    <bar>PGFiYz5IZWxsbyBXb3JsZDwvYWJjPg==</bar>
</foo>