2011-12-02 162 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