You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:24:58