使用静态方法调用webservice接口,首先需生成客户端代码。
可使用eclipse或IDEA等开发工具,根据WSDL接口地址自动生成客户端代码。
以下代码中的java类(SapAsnService)便是使用eclipse根据WSDL接口地址自动生成的客户端代码。
SpringBoot依赖jar包
<!-- CXF webservice -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.1.11</version>
</dependency>
<!-- CXF webservice -->
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
/**
* 请求工具类
* @author xy
* @date 2018-8-10
*/
@SuppressWarnings("deprecation")
public class CxfClientUtils{
/**
* 动态调用WebServices
* @param url URL地址
* @param method 调用的方法名
* @param parameters 入参 json字符串
* @return
*/
public static Object[] invokeRemoteMethod(String url, String method, String parameters) {
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
if (!url.endsWith("wsdl")) {
url += "?wsdl";
}
Client client = dcf.createClient(url);
try {
Object[] objects = client.invoke(method, parameters);
return objects;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/*************************************静态调用接口方法**************************************/
/**
* 问题描述:
* 原来WebService能够正常返回结果,但是后续改变查询条件,导致服务端检索时间过长,客户端抛出: Could not send Message 错误。
* 解决方案:
* 在客户端延长超时时间:
* 设置web service 连接超时和读取超时
* @param service
*/
private static void setTimeoutTime(Object service){
//设置客户端的配置信息,超时等.
Client proxy = ClientProxy.getClient(service);
HTTPConduit conduit = (HTTPConduit) proxy.getConduit();
HTTPClientPolicy policy = new HTTPClientPolicy();
policy.setConnectionTimeout(2000); //连接超时时间2s.
policy.setReceiveTimeout(13000);//请求超时时间13s.
conduit.setClient(policy);
}
/**
* Webservices生成客户端代码方式调用
*/
public static void main(String[] argv) {
String url = "";
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
// 判断是否抛出异常
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getOutInterceptors().add(new LoggingOutInterceptor());
// 注册webservice接口
factory.setServiceClass(SapAsnService.class);
//配置webservice地址
factory.setAddress(url);
//获得接口对象
SapAsnService service=(SapAsnService)factory.create();
//设置客户端的配置信息,超时等.
setTimeoutTime(service);
//调用接口方法
service.getWmsAsn(parameters);
}
}