Axis 1.4调用SOAP服务时SimpleDeserializer遇到意外子元素错误如何解决
错误根因
该报错是Axis 1.4的内置SimpleDeserializer反序列化逻辑触发的异常:
WSDL中定义的接口返回值为String简单类型,Axis自动生成代码时默认给该返回字段绑定了SimpleDeserializer,该反序列化器仅支持解析纯文本内容,不接受字段包含XML子元素结构。而实际服务端返回的SOAP报文中,对应返回字段嵌套了未转义的XML标签,并非纯文本字符串,因此触发反序列化异常。
解决方案
可根据实际场景选择以下任意一种方案修复:
- 方案一:修改WSDL定义,将返回值的字段类型从
xs:string调整为xs:anyType或xs:element,重新用Axis的wsdl2java工具生成代码。调整后Axis不会使用SimpleDeserializer处理该字段,会将返回的节点解析为org.w3c.dom.Element对象,后续自行从Element对象中提取XML内容转为字符串即可。 - 方案二:不修改自动生成的代码,手动为返回字段注册自定义反序列化器。自行实现反序列化逻辑,不管接收的节点是否包含子元素,都统一将节点内容转为字符串,再绑定到返回字段上,核心代码示例:
// 替换为你接口返回字段对应的命名空间和字段名 QName returnQName = new QName("http://your.namespace.com", "getProduitsWebServicesXMLReturn"); Call call = service.createCall(); call.registerTypeMapping(String.class, returnQName, new org.apache.axis.encoding.ser.XMLStringSerializerFactory(), new org.apache.axis.encoding.ser.XMLStringDeserializerFactory());
- 方案三:如果可协调服务端改造,让服务端对返回的XML字符串做转义处理,将
<转义为<、>转义为>,使XML内容变为纯文本字符串放入SOAP响应,原有的SimpleDeserializer即可正常解析。 - 排查验证方法:开启Axis的请求响应日志打印,先确认完整的SOAP响应报文结构,确认返回字段是否确实包含未转义的XML子标签后再选择对应方案。
内容的提问来源于stack exchange,提问作者slim
相关产品推荐
相关产品推荐

