我有以下问题。我已经为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>�марант Българи� ООД</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
答案 0 :(得分:2)
当你编组DOM文档时,JAXB不负责实际的序列化和转义,它只是在内存中构建DOM树。然后,序列化由DOM实现处理。
编写xml时需要额外的转义通常是设计问题的标志,或者没有正确使用xml。如果您可以提供更多上下文,为什么需要这种转义,也许我可以建议一个替代解决方案。