如何使用Eclipse生成的Axis 1.4 Web Service客户端类?含认证与端点配置
Axis 1.4 Web Service Client 类作用与调用问题解决方案
一、Service包中各类的作用
先帮你理清这5个自动生成类的分工:
ServiceName:这是定义Web Service所有可调用方法的接口(比如你提到的submit()),是客户端调用服务的规范入口,所有Proxy和Stub都会实现这个接口。ServiceNameProxy:简化调用的代理类,内部自动完成Stub的初始化、端点配置等工作,让你不用手动处理底层细节,直接调用方法即可,适合快速开发场景。ServiceNameService:继承自JAX-RPC规范的javax.xml.rpc.Service,是服务的抽象表示,用于获取实际通信的Stub实例。ServiceNameServiceLocator:ServiceNameService的具体实现类,负责根据WSDL定位Web Service,生成并返回对应的Stub实例,默认会读取WSDL中的端点地址。ServiceNameSoapBindingStub:底层通信的Stub实现,直接与Web Service的SOAP端点交互,封装了认证、超时、端点地址等底层配置方法(比如你用到的setUsername()、setPassword())。
二、基础带参数调用示例
不管用Proxy还是Stub,调用方法的逻辑都是一致的,先构造方法所需的参数对象(来自datamodel或消息结构包),再调用对应的服务方法:
// 构造参数对象(假设submit方法需要SubmitRequest类型的参数) SubmitRequest request = new SubmitRequest(); request.setId("123"); request.setContent("test content"); // 用Proxy调用的基础示例 ServiceNameProxy proxy = new ServiceNameProxy(); SubmitResponse response = proxy.submit(request);
三、关键问题解决方案
1. 使用ServiceNameProxy时添加认证
Proxy类内部其实持有一个ServiceNameSoapBindingStub实例,只是默认没暴露出来。你可以通过以下两种方式获取并配置认证:
方法一:调用Proxy生成的getPort方法(推荐)
生成的Proxy类通常会包含一个getXXXPort()方法(比如getServiceNamePort()),直接调用它就能拿到内部的Stub:
ServiceNameProxy proxy = new ServiceNameProxy(); // 获取内部Stub并强制转型 ServiceNameSoapBindingStub stub = (ServiceNameSoapBindingStub) proxy.getServiceNamePort(); // 设置用户名密码 stub.setUsername("your-username"); stub.setPassword("your-password"); // 继续用Proxy调用方法,此时会使用配置好的认证信息 SubmitResponse response = proxy.submit(request);
方法二:反射获取Stub(如果Proxy没有暴露getPort方法)
如果生成的Proxy类没有提供获取Stub的方法,可以用反射强行获取内部的Stub实例:
ServiceNameProxy proxy = new ServiceNameProxy(); // 通过反射获取Proxy类中的stub字段 Field stubField = ServiceNameProxy.class.getDeclaredField("stub"); stubField.setAccessible(true); // 允许访问私有字段 ServiceNameSoapBindingStub stub = (ServiceNameSoapBindingStub) stubField.get(proxy); // 设置认证信息 stub.setUsername("your-username"); stub.setPassword("your-password"); // 调用服务方法 SubmitResponse response = proxy.submit(request);
2. 使用ServiceNameSoapBindingStub调用时设置端点
Stub类本身提供了setEndpointAddress()方法,直接调用就能自定义端点地址,不需要依赖Proxy的自动处理,步骤如下:
// 1. 通过Locator获取Stub实例 ServiceNameServiceLocator locator = new ServiceNameServiceLocator(); ServiceNameSoapBindingStub stub = (ServiceNameSoapBindingStub) locator.getServiceNamePort(); // 2. 设置自定义端点地址 stub.setEndpointAddress("http://your-custom-domain/your-service-path"); // 3. 设置认证信息 stub.setUsername("your-username"); stub.setPassword("your-password"); // 4. 调用服务方法 SubmitResponse response = stub.submit(request);
四、方案选择建议
- 如果你想保持代码简洁,不想处理底层细节,优先用Proxy+获取内部Stub加认证的方式。
- 如果你需要自定义端点、超时等更多底层配置,直接用Locator+Stub的组合,灵活性更高。
内容的提问来源于stack exchange,提问作者Neil Suri
相关产品推荐
相关产品推荐

