Axis2 Webservice Java客户端调用SOAP请求报SSL连接重置问题
问题根因排查
导致该报错的常见原因按出现概率排序如下:
- CDATA格式使用错误
SOAPUI中直接在请求报文中编写是有效的SOAP报文语法,但在Axis2客户端的Java代码中,直接将作为字符串赋值给参数是错误用法:Axis2序列化参数时会自动对XML特殊字符做转义,最终发出的报文中<、>会被转义为<、>,导致服务端收到的as_xml_peticion参数格式完全不符合预期,解析失败后主动断开连接触发重置报错。 - SSL配置不匹配
SOAPUI默认会自动信任自签名证书、适配服务端TLS版本,但Axis2客户端默认无相关兼容配置:如果服务端使用自签名SSL证书、或仅支持高版本TLS协议(如TLS1.2及以上),客户端未导入证书、未指定对应TLS版本会导致SSL握手失败,触发连接重置。 - 请求头参数缺失/不匹配
SOAPUI发送请求时会自动携带符合规范的SOAPAction、Content-Type请求头,部分服务端会强校验这两个参数,Axis2自动生成的客户端如果未配置对应头信息,会被服务端拦截后直接断开连接。 - 请求报文结构不符合WSDL定义
除CDATA问题外,若参数命名空间、层级结构和WSDL定义不一致,服务端解析报文出错也会主动断连。
修复方案
- 修正CDATA传参逻辑:直接传递纯XML内容,不要手动加标签,通过Axis2配置让序列化阶段自动给该字段加CDATA包裹,示例代码如下:
// 仅保留XML本体内容 String xml = "<G_PETICION>\n" + " <CABECERA>\n" + " <NOTIFICADOR>API</NOTIFICADOR>\n" + " </CABECERA>\n" + "</G_PETICION>"; tnofication.setAs_xml_peticion(xml); // 可在Stub类的as_xml_peticion字段上添加@XmlCDATA注解,实现序列化时自动加CDATA包裹 notification.setNotificacion(tnofication); WebserviceStub.NotificacionResponse response = proxy.notificacion(notification);
- 校验SSL配置:如果是测试环境可先配置Axis2客户端信任所有SSL证书、指定和服务端一致的TLS版本验证连通性,生产环境导入服务端证书到客户端信任库。
- 补全请求头:对比SOAPUI的请求头,给Axis2客户端配置相同的
SOAPAction和Content-Type头参数。 - 抓包校验:使用Fiddler、Wireshark等工具抓包,对比SOAPUI和Axis2客户端发出的报文差异,快速定位格式问题。
内容的提问来源于stack exchange,提问作者Carlos Aniés
相关产品推荐
相关产品推荐

