Java使用cxf发布及调用webservice接口的方法详解

 更新时间:2023年08月24日 10:30:47   作者:百里度  
今天小编就为大家分享一篇关于Java使用CXF发布及调用WebService接口的方法,文中通过代码示例给大家介绍的非常详细,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

一、cxf发布webservice接口

添加maven依赖

<dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-core</artifactId>
            <version>3.4.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>3.4.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http-jetty</artifactId>
            <version>3.4.3</version>
        </dependency>

这里的cxf-rt-transports-http-jetty依赖是内置jetty容器发布webservice接口

创建服务端接口

@WebService
public interface UserService {
    String getUserInfo(String name);
}
@WebService
public class UserServiceImpl implements UserService {
    @Override
    public String getUserInfo(String name) {
        return "我是" + name;
    }
}
public class test {
    public static void main(String[] args) {
        System.out.println("web service start");
        UserService implementor = new UserServiceImpl();
        String address = "http://127.0.0.1:8082/userService";
        JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();
        factoryBean.setAddress(address); // 设置暴露地址
        factoryBean.setServiceClass(UserService.class); // 接口类
        factoryBean.setServiceBean(implementor); // 设置实现类
        factoryBean.create();
        System.out.println("web service started");
        System.out.println("web service started");
    }
}

启动main方法,正常情况会发布成功

浏览器访问http://127.0.0.1:8082/userService?wsdl 返回下面内容说明发布成功

在这里插入图片描述

二、客户端进行动态调用webservice接口

 public static void main(String[] args) throws Exception {
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
        Client client = dcf.createClient("http://127.0.0.1:8082/userService?wsdl");
        // namespace是命名空间,methodName是方法名
        QName name = new QName("http://service.test.example.com/", "getUserInfo");
        Object[] objects = client.invoke(name, "我没收到反馈");
        System.out.println(objects[0].toString());
    }

正常情况调用接口会返回成功

cxf的动态调用不适合传递自定义对象,需要传递自定义对象,需要使用静态调用生成本地代码

三、cxf静态调用生成本地代码

采用apache-cxf-3.4.3版本,jar包可到官网下载 http://cxf.apache.org/download.html

使用JAX-WS Proxy代理工厂方式开发客户端,首先需要使用wsdl2java工具生成web service在本地的代理接口

1、配置环境变量

wsdl2java.bat在CXF根目录\bin目录下,使用之前需要配置CXF环境变量,CXF_HOME变量值为CXF根目录,并在path中添加%CXF_HOME%\bin,如:

在这里插入图片描述

在这里插入图片描述

2、wsdl2java生成代理接口配置好环境变量后,打开CMD命令行窗口,将当前目录切换到java工程src目录下,命令行输入如下格式命令,回车,即可根据wsdl生成服务端的代理接口。

wsdl2java -p ws.cxf -client http://127.0.0.1:8082/userService?wsdl

在这里插入图片描述

命令说明:

-p 指定代理接口所在包名,-client(生成客户端) 后面的字符串声明了服务接口的wsdl

public static void test() {
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setServiceClass(UserService.class);
        factory.setAddress("http://127.0.0.1:8082/userService");
        Object object = factory.create();
        UserService service = (UserService) object;
        UserVO userVO = new UserVO();
        userVO.setName("李师傅打开");
        String userInfo = service.getUserInfo(userVO);
        System.out.println(userInfo);
    }

3、第二种调用方法

 ExecuteBindQSService executeBindQSService = new ExecuteBindQSService(ExecuteBindQSService.getWsdlLocation(WSDL_URL));
        ExecutePtt executePtt = executeBindQSService.getExecuteBindQSPort();
	//获取代理,并设置日志拦截器,打印日志
        Client client = ClientProxy.getClient(executePtt);
        client.getInInterceptors().add(new LoggingInInterceptor());
        client.getOutInterceptors().add(new LoggingOutInterceptor());
        // 超时时间设置
		HTTPConduit http = (HTTPConduit) clientProxy.getConduit();
		HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
		httpClientPolicy.setConnectionTimeout(Integer
				.valueOf(webServiceConTimeout));
		httpClientPolicy.setReceiveTimeout(Integer
				.valueOf(webServiceRevTimeout));
		httpClientPolicy.setAllowChunking(false);
		http.setClient(httpClientPolicy);
		//调用方法执行
		Response response = executePtt.execute(request);

4、关闭元素校验

@EndpointProperty(key = “soap.no.validate.parts”, value = “true”)

在这里插入图片描述

四、使用的是apache的axis实现的

第二种访问webservice的方法是通过idea生成客户端代码,访问服务端接口向访问本地接口一样。使用的是apache的axis实现的。

以上就是Java使用cxf发布及调用webservice接口的方法详解的详细内容,更多关于Java 使用cxf调用webservice接口的资料请关注脚本之家其它相关文章!

相关文章

  • Java如何获取接口所有的实现类

    Java如何获取接口所有的实现类

    这篇文章主要介绍了Java如何获取接口所有的实现类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • java中 == 与 equal 的区别讲解

    java中 == 与 equal 的区别讲解

    这篇文章介绍了java中 == 与 equal 的区别,有需要的朋友可以参考一下
    2013-10-10
  • Java通过SSH连接路由器输入命令并读取响应的操作方法

    Java通过SSH连接路由器输入命令并读取响应的操作方法

    最近需要读取和修改华为路由器的配置,使用Java语言开发,通过SSH连接,输入命令并读取响应,接下来通过本文给大家介绍下Java通过SSH连接路由器,输入命令并读取响应,需要的朋友可以参考下
    2024-01-01
  • java9开始——接口中可以定义private私有方法

    java9开始——接口中可以定义private私有方法

    这篇文章主要介绍了从java9开始 接口中可以定义private私有方法,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-10-10
  • Thymeleaf中th:each及th:if使用方法解析

    Thymeleaf中th:each及th:if使用方法解析

    这篇文章主要介绍了Thymeleaf中th:each及th:if使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Java实现权重随机获取值或对象的方法

    Java实现权重随机获取值或对象的方法

    这篇文章主要介绍了Java实现权重随机获取值或对象的方法,treeMap是一种基于红黑树实现的有序映射表,提供了一系列的方法来操作映射表中的元素,其中tailMap方法是用于返回映射表中大于或等于给定键的部分视图,需要的朋友可以参考下
    2023-11-11
  • Idea2023配置JavaWeb项目(最新)

    Idea2023配置JavaWeb项目(最新)

    本文将介绍如何配置JavaWeb项目,以在Idea中实现开发环境,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • Java 超详细图解集合框架的数据结构

    Java 超详细图解集合框架的数据结构

    什么是集合框架呢?集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。最简单的集合如数组、列表和队列等,任何集合框架一般包含:对外的接口、接口的实现和对集合运算的算法
    2022-04-04
  • Spring中基于xml的AOP实现详解

    Spring中基于xml的AOP实现详解

    这篇文章主要介绍了Spring中基于xml的AOP实现详解,基于xml与基于注解的AOP本质上是非常相似的,都是需要封装横切关注点,封装到切面中,然后把横切关注点封装为一个方法,再把该方法设置为当前的一个通知,再通过切入点表达式定位到横切点就可以了,需要的朋友可以参考下
    2023-09-09
  • Java selenium上传文件的实现

    Java selenium上传文件的实现

    本文主要介绍了Java selenium上传文件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04

最新评论