jaxb base64binary кодирование / декодирование - PullRequest
3 голосов
/ 02 декабря 2011

Мне нужно было включить объект MimeMessage в ответ службы.Поэтому я решил использовать базовый тип base64binary.Сообщение подготовлено кодом:

//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 , но должно быть просто = .

Я думаю, что это может быть связано с кодированием, нои marhaller, и unmarshaller используют UTF-8 по умолчанию.

Любой совет поможет, спасибо Марек.

1 Ответ

1 голос
/ 02 декабря 2011

Я быстро попробовал это на моем конце, и это работает; есть что-то еще, что вы не опубликовали, что может вызвать вашу проблему. Я использовал 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>
...