You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

出现org.xml.sax.SAXException异常,如何支持无CDATA的SOAP XML解析

报错原因

你遇到的org.xml.sax.SAXException报错,核心原因是服务端ProcessMessage接口的入参在WSDL中被定义为简单字符串类型,服务端反序列化时预期接收纯文本内容,你直接传入<envelope>子XML节点就会触发SimpleDeserializer的类型校验异常。用CDATA包裹时,整段内容会被识别为纯字符串,符合类型定义所以可以正常执行。

服务端调整步骤

1. 修改WSDL类型定义

将ProcessMessage的入参从简单字符串类型改为支持XML子节点的结构,两种可选方案:

  • 方案一:显式定义envelope节点的结构,适合envelope结构固定的场景
<xs:element name="ProcessMessage" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="envelope">
        <!-- 这里定义envelope内部的子节点结构 -->
        <xs:complexType>
          <xs:sequence>
            <!-- 按实际业务补充内部字段定义 -->
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>
  • 方案二:设置为允许任意XML节点的xs:any类型,适合envelope结构不固定的场景
<xs:element name="ProcessMessage" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType>
    <xs:sequence>
      <xs:any processContents="lax" namespace="##any"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

2. 同步更新服务端接口实现

根据你使用的SOAP框架调整接口参数类型,不要用String接收参数:

  • 如果是Spring WS,将参数类型改为org.w3c.dom.Element或者WSDL生成的对应Envelope实体类:
@PayloadRoot(namespace = "http://www.user.com/test/", localPart = "ProcessMessage")
public void handleProcessRequest(@RequestPayload Element envelope) {
    // 业务逻辑,直接解析Element对象即可
}
  • 如果是Axis/AXIS2框架,重新根据修改后的WSDL生成服务端代码,替换原有实现类的参数类型即可。

3. 验证发布

修改完成后重新发布服务,即可直接接收无需CDATA包装的XML请求。


内容的提问来源于stack exchange,提问作者A.J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 16:54:06