2013-10-17 1 views
2

String 변수가 포함 된 객체를 마샬링해야합니다.
문자열 var. XML 문서가 포함되어 있으며 XMLElement로 이스케이프 처리하여 마샬링됩니다.JAXB Marshall base64로 문자열

String 변수를 base64 형식으로 마샬링하고 unmarshall에서 String으로 되돌리고 싶습니다.

이것은 가능한가요?

답변

5

XmlAdapter을 사용하면 마샬링/언 마샬링 과정에서 Stringbyte[]으로 /에서 변환 할 수 있습니다. 기본적으로 JAXB는 byte[]base64Binary으로 나타냅니다. 다음은

(때문에) XmlAdapter (Base64Adapter)는 Stringbyte[] 사이의 변환 것 XmlAdapter입니다.

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(); 
    } 

} 

자바 모델 (푸)

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