java如何调用wsdl接口
调用WSDL接口的方法
使用JAX-WS生成客户端代码
通过wsimport工具生成客户端存根代码,该工具是JDK自带的。假设WSDL地址为http://example.com/service?wsdl,执行以下命令:
wsimport -keep -p com.example.client http://example.com/service?wsdl
参数说明:
-keep:保留生成的.java源文件-p:指定生成代码的包名
生成后会在指定包路径下创建服务端点和接口类,直接实例化即可调用:
MyService service = new MyService();
MyServicePortType port = service.getMyServicePort();
String result = port.someMethod(param1, param2);
动态代理方式调用
不生成静态代码,运行时动态创建代理:
URL wsdlUrl = new URL("http://example.com/service?wsdl");
QName serviceName = new QName("http://example.com/", "MyService");
Service service = Service.create(wsdlUrl, serviceName);
MyServicePortType port = service.getPort(MyServicePortType.class);
使用Apache CXF框架
添加Maven依赖:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.5.5</version>
</dependency>
代码实现:
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(MyServicePortType.class);
factory.setAddress("http://example.com/service");
MyServicePortType client = (MyServicePortType) factory.create();
client.someMethod(param);
处理WS-Security等扩展
对于需要安全认证的接口,CXF提供WS-Security支持:
Map<String, Object> props = new HashMap<>();
props.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
props.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
props.put(WSHandlerConstants.PW_CALLBACK_CLASS, ClientPasswordCallback.class.getName());
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.getOutInterceptors().add(new WSS4JOutInterceptor(props));
注意事项
- 生成的客户端代码需与服务端保持版本同步
- 复杂类型可能需要额外处理数据绑定
- 生产环境建议添加连接超时设置:
BindingProvider bp = (BindingProvider)port; bp.getRequestContext().put(BindingProviderProperties.CONNECT_TIMEOUT, 10000); bp.getRequestContext().put(BindingProviderProperties.REQUEST_TIMEOUT, 30000);







