2013-10-17 52 views
2

我需要編組一個包含String變量的對象。
The String var。包含一個XML文檔,並且將其轉義並轉義爲XMLElement。JAXB Marshall String to base64

我想將字符串變量編組爲base64格式,並返回到unmarshall上的字符串。

這是可能的嗎?

回答

5

您可以使用XmlAdapter期間編組/解組過程中Stringbyte[]轉換成/。默認情況下,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模型(美孚)

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> 
+0

這是正確的,但是,對於那些本例中沒有工作,你必須檢查自版本「2.1.13」以來'jaxb-impl'的版本有一個錯誤。只需將版本更改爲「2.1.17」即可使其工作。 – lopezvit