出现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
相关产品推荐
相关产品推荐

