如何在WSDL生成的SOAP Web客户端中使用Holder<Payload>
使用WSDL生成的WebService客户端发送请求实操指南
我来帮你一步步梳理怎么用这个生成的WebService客户端发送请求,结合你给出的接口和客户端类来拆解:
1. 先理解核心接口
你给出的IConnectService接口是核心服务入口,关键代码如下:
public interface IConnectService { public void processMessage( @WebParam(name = "payload", mode = WebParam.Mode.INOUT) Holder<Payload> payload ); }
这里要重点注意:@WebParam的mode是INOUT,意味着这个Holder<Payload>参数既是请求入参,又是响应出参——你传入的Payload会被服务端处理,处理后的结果会存回同一个Holder对象里。
2. 客户端代码使用步骤
结合生成的ConnectService客户端类,具体使用流程如下:
第一步:初始化服务实例
因为ConnectService继承了Service,直接实例化即可(生成的代码里已经帮你封装了WSDL地址):ConnectService connectService = new ConnectService();如果需要指定自定义的WSDL地址,也可以用带URL参数的构造方法,覆盖默认的
CONNECTSERVICE_WSDL_LOCATION。第二步:获取服务端口代理
通过服务实例拿到实际的接口代理对象,方法名一般是get[端口名称]Port,具体以生成的代码为准:IConnectService servicePort = connectService.getIConnectServicePort();第三步:准备请求参数
先创建你的请求Payload对象,设置好需要的业务参数,再用Holder类包装(Holder是JAX-WS里专门用于INOUT模式的容器类):Payload requestPayload = new Payload(); // 给Payload设置具体参数,比如requestPayload.setData("你的请求数据"); Holder<Payload> payloadHolder = new Holder<>(requestPayload);第四步:调用服务方法
直接调用processMessage方法,传入包装好的Holder对象:servicePort.processMessage(payloadHolder);第五步:获取响应结果
调用完成后,服务端处理后的Payload就存在payloadHolder.value里了,直接取出使用即可:Payload responsePayload = payloadHolder.value; // 处理响应数据,比如打印或解析responsePayload的字段
3. 额外注意事项
- WSDL地址有效性:确保
CONNECTSERVICE_WSDL_LOCATION指向的地址能正常访问服务端,本地开发时如果服务端地址变更,记得修改这个常量或者通过代码动态指定。 - 配置请求属性:如果需要设置超时、认证信息或者修改服务端地址,可以通过
BindingProvider来调整:BindingProvider bindingProvider = (BindingProvider) servicePort; // 动态修改服务端地址 bindingProvider.getRequestContext().put( BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://your-service-url/ConnectService" ); // 设置连接和读取超时(单位:毫秒) bindingProvider.getRequestContext().put("javax.xml.ws.client.connectionTimeout", "30000"); bindingProvider.getRequestContext().put("javax.xml.ws.client.receiveTimeout", "30000"); - Payload字段匹配:生成的
Payload类字段是和WSDL定义一致的,要按照服务端的接口文档设置正确的参数,避免因字段不匹配导致请求失败。
内容的提问来源于stack exchange,提问作者asymmetricat
相关产品推荐
相关产品推荐

