【问题标题】:Not escaping characters in Spring WS SOAP body不在 Spring WS SOAP 正文中转义字符
【发布时间】: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>&lt;myxml>stuff&lt;/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。
  • 请参阅thisthis 问题。如果您使用的是 JAXB-ri,则必须对 ContextHandler 使用一些技巧。使用 MOXy,您可以使用 @XmlCDATA 扩展名。

标签: java xml soap apache-camel spring-ws


【解决方案1】:

我使用 MOXy 和 @XmlCDATA 注释来生成 CDATA 内容,实验表明 AxiomSoapMessageFactory 用转义的 XML 内容重新生成它(尽管 Jaxb2Marshaller 似乎生成了正确的 CDATA 内容)。

但是,它与 SaajSoapMessageFactory 配合得很好。

【讨论】:

    猜你喜欢
    • 2023-02-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多