• 技术文章 >Java >java教程

    java整合CXF完成web service开发的实例详解

    Y2JY2J2017-05-12 09:54:51原创779
    这篇文章主要介绍了Spring boot 整合CXF开发web service示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    前言

    说起web service最近几年restful大行其道,大有取代传统soap web service的趋势,但是一些特有或相对老旧的系统依然使用了传统的soap web service,例如银行、航空公司的机票查询接口等。

    目前就遇到了这种情况,需要在系统中查询第三方提供的soap web service接口,也就是说要将它整合进现有的系统当中。

    spring整合CXF本来十分简单,但是因为使用了Spring boot,不想用以前xml一堆配置的方式,那么能否按照Spring boot的风格优雅的进行整合呢?

    答案当然是肯定的,但是遍查网上几乎没有这方面的资料,折腾过后觉得还是有必要记录一下,虽然它显得非常的简单。

    添加依赖

    Maven的项目,首先当然是添加依赖了,除了原先Spring boot的依赖之外,还需要添加cxf依赖:

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

    编写业务代码

    这里我们以查询用户信息为例,创建一个自定义的User对象

    public class User implements Serializable {
      private static final long serialVersionUID = -5939599230753662529L;
      private Long       userId;
      private String      username;
      private String      email;
      private Date       gmtCreate;
      //getter setter ......
    }

    接下来创建一个用于提供web service服务的用户接口,共两个方法getNamegetUser,一个返回普通的String,一个返回自定义对象:

    @WebService
    public interface UserService {
      @WebMethod
      String getName(@WebParam(name = "userId") Long userId);
      @WebMethod
      User getUser(Long userId);
    }

    有接口当然要有业务代码实现了,这里我们只做简单的演示:

    public class UserServiceImpl implements UserService {
      private Map<Long, User> userMap = new HashMap<Long, User>();
      public UserServiceImpl() {
        User user = new User();
        user.setUserId(10001L);
        user.setUsername("liyd1");
        user.setEmail("liyd1@qq.com");
        user.setGmtCreate(new Date());
        userMap.put(user.getUserId(), user);
        user = new User();
        user.setUserId(10002L);
        user.setUsername("liyd2");
        user.setEmail("liyd2@qq.com");
        user.setGmtCreate(new Date());
        userMap.put(user.getUserId(), user);
        user = new User();
        user.setUserId(10003L);
        user.setUsername("liyd3");
        user.setEmail("liyd3@qq.com");
        user.setGmtCreate(new Date());
        userMap.put(user.getUserId(), user);
      }
      @Override
      public String getName(Long userId) {
        return "liyd-" + userId;
      }
      @Override
      public User getUser(Long userId) {
        return userMap.get(userId);
      }
    }

    发布服务

    接口和业务代码我们都写完了,剩下的就是发布服务了,也就是Spring boot和cxf的整合。

    其实这二者的整合十分的简单,比以前xml的方式更加的简洁,所有相关的代码如下:

    @Configuration
    public class CxfConfig {
      @Bean
      public ServletRegistrationBean dispatcherServlet() {
        return new ServletRegistrationBean(new CXFServlet(), "/soap/*");
      }
      @Bean(name = Bus.DEFAULT_BUS_ID)
      public SpringBus springBus() {
        return new SpringBus();
      }
      @Bean
      public UserService userService() {
        return new UserServiceImpl();
      }
      @Bean
      public Endpoint endpoint() {
        EndpointImpl endpoint = new EndpointImpl(springBus(), userService());
        endpoint.publish("/user");
        return endpoint;
      }
    }

    可以看到从配置cxf到发布服务,都只需要一二行代码,出乎意料的简单吧?

    到这里我们所有的操作就都完成了,启动Spring boot,访问 localhost:8080/soap/user?wsdl

    可以看到有相关的wsdl描述信息输出了,说明服务已经发布了。

    调用服务

    发布了web service服务,那怎么调用呢,像整合一些第三方接口也是先有调用才后有发布啊?

    调用soap web service,一般的方法是根据wsdl生成客户端代码,整合之后就可以像调用本地接口一样使用了。

    但是我个人不怎么喜欢这种方式,每个接口都要生成一次还有一堆的代码,感觉比较麻烦。

    相对更喜欢传入方法名调用的方式,显得清爽而简洁,以下就是所有代码了:

    JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
    Client client = dcf.createClient("http://localhost:8080/soap/user?wsdl");
    Object[] objects = client.invoke("getUser", 10002L);
    //输出调用结果
    System.out.println(objects[0].getClass());
    System.out.println(objects[0].toString());

    这种方式要注意的就是,如果调用的服务接口返回的是一个自定义对象,那么结果Object[]中的数据类型就成了这个自定义对象(组件帮你自动生成了这个对象),

    但是你本地可能并没有这个类,所以需要自行转换处理,最简单的是新建一个跟返回结果一模一样的类进行强转,当然更好的方式是封装一个通用的,这个不是本文主题就不在这深入讨论了。

    【相关推荐】

    1. Java免费视频教程

    2. JAVA教程手册

    3. 全面解析Java注解

    以上就是java整合CXF完成web service开发的实例详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:spring boot整合cxf java
    上一篇:详解cglib和jdk两种动态代理 下一篇:“微服务”之服务注册与发现的实例详解

    相关文章推荐

    • JAVA-5NIO之Selector• Java开发中的23种设计模式详解• java对象的序列化和反序列化• Java程序员,最常用的20%技术有哪些?• Java 征途:行者的地图

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网