jaxb marshaller characterEscapeHandler

时间:2011-05-09 10:07:38

标签: java jaxb marshalling

我有以下问题。我已经为marshaller设置了以下属性:


marshaller.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE );
marshaller.setProperty( "com.sun.xml.bind.characterEscapeHandler", new CharacterEscapeHandler() {
    public void escape(char[] ch, int start, int length, boolean isAttVal, Writer out) throws IOException {
        String s = new String(ch, start, length);
        System.out.println("Inside CharacterEscapeHandler...");
        out.write(StringEscapeUtils.escapeXml(StringEscapeUtils.unescapeXml(s)));
    }
});

当我尝试使用以下代码将对象编组到SOAPBody时:

SOAPMessage message = MessageFactory.newInstance().createMessage();
marshaller.marshal(request, message.getSOAPBody());

未调用CharacterEscapeHandler.escape,并且不转义字符,但此代码:

StringWriter writer = new StringWriter();
marshaller.marshal(request, writer);

调用CharacterEscapeHandler.escape(),并且所有字符都被转义...这是JAXB的正常行为。如何在将字符放入SOAP的主体之前转义字符?

更新

我们的系统必须与另一个系统进行通信,该系统希望文本被转义。 其他系统发送的消息示例:

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
    <env:Body xmlns:ac="http://www.ACORD.org/Standards/AcordMsgSvc/1">
        <ac:CallRs xmlns:ac="http://www.ACORD.org/Standards/AcordMsgSvc/1">
            <ac:Sender>
                <ac:PartyId>urn:partyId</ac:PartyId>
                <ac:PartyRoleCd/>
                <ac:PartyName>PARTYNAME</ac:PartyName>
            </ac:Sender>
            <ac:Receiver>
                <ac:PartyRoleCd>broker</ac:PartyRoleCd>
                <ac:PartyName>&#208;&#65533;&#208;&#188;&#208;&#176;&#209;&#8364;&#208;&#176;&#208;&#189;&#209;&#8218; &#208;&#8216;&#209;&#352;&#208;&#187;&#208;&#179;&#208;&#176;&#209;&#8364;&#208;&#184;&#209;&#65533; &#208;&#382;&#208;&#382;&#208;&#8221;</ac:PartyName>
            </ac:Receiver>
            <ac:Application>
                <ac:ApplicationCd>applicationCd</ac:ApplicationCd>
                <ac:SchemaVersion>schemaversion/</ac:SchemaVersion>
            </ac:Application>
            <ac:TimeStamp>2011-05-11T18:41:19</ac:TimeStamp>
            <ac:MsgItem>
                <ac:MsgId>30d63016-fa7d-4410-a19a-510e43674e70</ac:MsgId>
                <ac:MsgTypeCd>Error</ac:MsgTypeCd>
                <ac:MsgStatusCd>completed</ac:MsgStatusCd>
            </ac:MsgItem>
            <ac:RqItem>
                <ac:MsgId>d8c2d9c4-3f1c-459f-abe1-0e9accbd176b</ac:MsgId>
                <ac:MsgTypeCd>RegisterPolicyRq</ac:MsgTypeCd>
                <ac:MsgStatusCd>completed</ac:MsgStatusCd>
            </ac:RqItem>
            <ac:WorkFolder>
                <ac:MsgFile>
                    <ac:FileId>cid:28b8c9d1-9655-4727-bbb2-3107482e7f2e</ac:FileId>
                    <ac:FileFormatCd>text/xml</ac:FileFormatCd>
                </ac:MsgFile>
            </ac:WorkFolder>
        </ac:CallRs>
    </env:Body>
</env:Envelope>

所以我需要转义开始/结束标签之间的所有文本..就像这里面的ac:PartyName

1 个答案:

答案 0 :(得分:2)

当你编组DOM文档时,JAXB不负责实际的序列化和转义,它只是在内存中构建DOM树。然后,序列化由DOM实现处理。

编写xml时需要额外的转义通常是设计问题的标志,或者没有正确使用xml。如果您可以提供更多上下文,为什么需要这种转义,也许我可以建议一个替代解决方案。