CXF客户端工具类

 使用静态方法调用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);
	}
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot集成CXF时,可以使用CXF提供的工具类org.apache.cxf.jaxws.JaxWsProxyFactoryBean创建WebService客户端,并使用该客户端调用WebService接口方法。生成的SOAP请求包可以通过在客户端代码中添加日志输出或使用抓包工具进行捕获。 以下是一个示例: 1. 定义WebService接口 ```java package com.example.demo; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; @WebService public interface HelloWorld { @WebMethod String sayHello(@WebParam(name = "name") String name); } ``` 2. 创建WebService客户端 ```java package com.example.demo; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; public class HelloWorldClient { public static void main(String[] args) { JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.setServiceClass(HelloWorld.class); factory.setAddress("http://localhost:8080/helloWorld"); HelloWorld helloWorld = (HelloWorld) factory.create(); String result = helloWorld.sayHello("World"); System.out.println(result); } } ``` 在以上代码中,通过JaxWsProxyFactoryBean创建了一个HelloWorld接口的代理对象,并指定了WebService的地址。调用sayHello方法后,将结果打印到控制台。 3. 查看SOAP请求包 可以通过在客户端代码中添加日志输出或使用抓包工具进行捕获,例如使用Wireshark进行抓包,然后在过滤器中设置“http.request.method == POST && tcp.port == 8080”进行过滤,即可查看请求数据包。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值