【发布时间】:2012-04-25 14:50:03
【问题描述】:
我正在使用 Java 和 Spring-ws 构建 Web 服务。它工作正常,除了一件事。
当我组装要放入 SOAP 主体中的有效负载时,我想包含 CDATA 转义字符串。这就是我希望结果的样子:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:_0="http://example.com/ns">
<soapenv:Header/>
<soapenv:Body>
<_0:Message>
<_0:StringPayload><![CDATA[<myxml>stuff</myxml>]]></_0:StringPayload>
</_0:Message>
</soapenv:Body>
</soapenv:Envelope>
但是,Spring-WS 在添加 SOAP 信封时似乎会篡改有效负载。这是我得到的结果:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:_0="http://example.com/ns">
<soapenv:Header/>
<soapenv:Body>
<_0:Message>
<_0:StringPayload><myxml>stuff</myxml></StringPayload>
</_0:Message>
</soapenv:Body>
</soapenv:Envelope>
有没有办法确保 Spring WS 不会转义 XML 字符并尊重 CDATA 标记?
我将 Spring WS 与 Apache Camel 一起使用,因此我更喜欢不需要更改/扩展 spring-ws 类的解决方案。
【问题讨论】:
-
您使用
org.springframework.ws.soap.SoapMessageFactory的什么实现(公理?saaj?)?你用什么org.springframework.ws.server.endpoint.adapter.method.MethodReturnValueHandler(编组、jaxb、castor、AbstractPayloadSourceMethodProcessor)? -
为什么?对于 xml 解析器和 Web 服务堆栈,这两者是等价的。
-
@GrzegorzGrzybek 该消息属于 SAAJ 类型。我不确定使用的是哪个 MethodReturnValueHandler,但我认为那将是 JAXB。
-
@JörnHorstmann 感谢您提及这一点。但是,使用 CData 部分而不是转义字符,内容更易于人类阅读。在这种情况下,人类可读的因素是相当大的。所有业务数据都将在该标签内。它将在 XML 中捆绑 XML。
标签: java xml soap apache-camel spring-ws