Java 调用 WebService 接口,本质就是按照 SOAP 协议,通过 XML 格式发送请求报文到远端服务地址,拿到 XML 响应之后再解析成 Java 对象,传统 WebService 一般基于 WSDL 描述文件,也就是服务端会提供 wsdl 地址,里面定义了服务名称、方法、参数、返回值,Java 主流有三种调用方案,JDK 原生 JAX-WS、CXF 框架、Axis,现在老项目对接政企、银行、第三方系统最常用的是 CXF,JDK 自带 JAX-WS 不需要额外引入第三方包,适合简单调用,但是复杂报文、自定义头、证书鉴权的时候不如 CXF 灵活,很多初学者容易混淆 WebService 和普通 REST 接口,WebService 是 SOAP+XML,不是 JSON,请求报文是 XML,这点是核心区别,调用之前第一步必须拿到对方提供的 wsdl 文档或者 wsdl 访问地址,确认命名空间、方法名、参数名称。
三种调用方案对比
| 方案 | 特点 | 适用场景 |
|---|---|---|
| JAX-WS JDK 原生 | JDK 自带,无需第三方依赖,使用 wsimport 生成客户端代码 | 简单接口,不想引入额外 jar 包 |
| Apache CXF | 功能强大,支持 SOAP1.1/1.2,支持自定义 Header、证书、超时、拦截器,企业项目主流 | 复杂政企银行对接,带鉴权头 |
| Axis1 Axis2 | 老牌框架,现在新项目很少使用,老遗留系统才会见到 | 历史旧项目维护 |
方案一 JAX-WS wsimport 生成客户端代码
执行步骤
第一步 使用 JDK 自带 wsimport 命令,根据 wsdl 地址生成 Java 客户端类
wsimport -keep http://xxx/xxx?wsdl
第二步 生成之后会得到 Service 类和 Port 接口类
第三步 代码里面实例化 Service 对象,获取 port 端口对象,直接调用对应的业务方法
优点 官方原生,无额外 jar,上手简单
缺点 对自定义 SOAPHeader、证书、特殊编码支持比较麻烦,扩展能力有限
方案二 Apache CXF 调用(企业推荐)
核心依赖 maven 引入 cxf 相关依赖
两种调用模式
1 动态客户端 DynamicClientFactory,不需要提前根据 wsdl 生成代码,运行时动态调用,适合临时测试、动态接口
2 生成 stub 客户端,和 wsimport 类似,提前生成 port 接口,代码调用更规范
重点扩展能力
自定义 SOAPHeader 很多 WebService 需要在报文头部加入账号令牌鉴权
设置连接超时、读取超时
支持 https 证书校验,忽略证书或者导入信任证书
处理中文乱码,指定编码 UTF-8
添加拦截器,打印完整请求和响应 XML 报文,排查问题必备
高频踩坑问题清单
中文乱码 报文编码不是 UTF-8,需要统一设置编码
SOAPHeader 鉴权失败 命名空间写错,或者头节点名称和服务端要求不一致
超时无响应 需要手动设置 connectTimeout receiveTimeout
https 证书报错 服务端是自签名证书,客户端信任校验失败
wsdl 访问不通 网络防火墙、内网权限,需要确认可以浏览器打开 wsdl 地址
命名空间 namespace 错误 调用报错,参数无法识别,这个是最常见错误
补充深度知识点
WebService 是 SOAP 协议,属于老一代跨系统集成方案,现在新系统大多改用 RESTful 接口,但是银行、政务、国企老系统仍然大量保留 WebService,所以 Java 后端面试和项目经常会遇到对接需求。
调用之后可以开启 CXF 日志拦截器,把原始请求 XML 和返回 XML 打印出来,定位参数格式错误,这个调试技巧非常实用。
【常见问题】
问题 1 java 调用 webservice 接口 是传 JSON 吗
回答 1 java 调用 webservice 接口,标准 SOAP WebService 使用 XML 报文,不是 JSON,这点和普通 REST 接口不一样。
问题 2 java 调用 webservice 接口 wsimport 是什么作用
回答 2 java 调用 webservice 接口,wsimport 是 JDK 自带工具,根据 wsdl 地址自动生成客户端 stub 代码,不用手写 XML 报文。
问题 3 java 调用 webservice 接口 企业项目为什么优先 CXF
回答 3 java 调用 webservice 接口,CXF 支持自定义 SOAPHeader、超时、证书、拦截日志,复杂鉴权场景比 JDK 原生 JAX-WS 更灵活,是政企对接主流选择。
问题 4 java 调用 webservice 接口 中文乱码怎么处理
回答 4 java 调用 webservice 接口中文乱码,一般是编码不统一,客户端和服务端统一设置 UTF-8 编码,同时检查报文头编码声明。
【免责申明】
本文 java 调用 webservice 接口相关内容基于 JAX-WS 与 Apache CXF 公开技术文档整理,不同服务端版本 SOAP 规范存在差异,正式对接请以对方 WSDL 文档规范为准,内容仅作为开发学习参考。
