2011-12-02 186 views
3

我需要在服務響應中包含MimeMessage對象。 所以基本上我決定使用base64binary類型。 消息是由代碼來製備:jaxb base64二進制編碼/解碼

//message is a MimeMessage type 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
message.writeTo(baos); 
byte[] bytes = baos.toByteArray(); 
content.setMessageContent(bytes); 

並且在模式被表示爲:

<xs:simpleType name="MessageContent"> 
    <xs:restriction base="xs:base64Binary"> 
     <xs:whiteSpace value="collapse" fixed="true"/> 
    </xs:restriction> </xs:simpleType> 

我正在響應與未編碼正確的字符。例如%3D轉換爲= 3D,但應該只是=

我認爲它可能與編碼有關,但是mahaller和unmarshaller都使用UTF-8作爲默認值。

任何提示將幫助, 謝謝 馬立克。

回答

1

我很快就在我的這一端嘗試了這一點,它的工作原理;還有一些你沒有發佈的信息可能會導致你的問題。我使用NetBeans 7.1來生成類(全部是開箱即用的);嘗試一下,看看你是否得到相同的結果。那麼請讓我知道...

XSD:

<?xml version="1.0" encoding="utf-8" ?> 
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" 
    elementFormDefault="qualified" 
    xmlns="http://tempuri.org/XMLSchema.xsd" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="Message"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="content" type="MessageContent"/> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 

    <xsd:simpleType name="MessageContent"> 
     <xsd:restriction base="xsd:base64Binary"> 
      <xsd:whiteSpace fixed="true" value="collapse"/> 
     </xsd:restriction> 
    </xsd:simpleType> 
</xsd:schema> 

的Java代碼片斷:

JAXBContext jc = JAXBContext.newInstance(("org.tempuri.xmlschema")); 
Marshaller m = jc.createMarshaller(); 
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
ObjectFactory o = new ObjectFactory(); 
Message msg = o.createMessage(); 
byte[] data = new byte[] {0x45, 0x31}; 
msg.setContent(data); 
m.marshal(msg, System.out); 

結果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Message xmlns="http://tempuri.org/XMLSchema.xsd"> 
    <content>RTE=</content> 
</Message> 
+0

謝謝你的回答,生病提取更多代碼並更新我的帖子。 – Marek