Spring boot 整合CXF开发web service示例

 更新时间:2017年05月02日 16:40:15   作者:Joker_Ye  
这篇文章主要介绍了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,访问 http://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[]中的数据类型就成了这个自定义对象(组件帮你自动生成了这个对象),

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot如何注册Servlet、Filter、Listener的几种方式

    SpringBoot如何注册Servlet、Filter、Listener的几种方式

    在Servlet 3.0之前都是使用web.xml文件进行配置,这篇文章主要介绍了SpringBoot如何注册Servlet、Filter、Listener的几种方式,在Servlet 3.0之前都是使用web.xml文件进行配置,
    2018-10-10
  • 解析Hibernate + MySQL中文乱码问题

    解析Hibernate + MySQL中文乱码问题

    如果持久化的类中有包括了汉字的String对象,那么对应到数据库中汉字的部分就会是乱码。这主要是由于MySQL数据表的字符集与我们当前使用的本地字符集不相同造成的
    2013-07-07
  • java堆排序原理及算法实现

    java堆排序原理及算法实现

    本篇文章主要介绍了堆排序的简介,定义,算法实现以及堆排序的性质。想要了解的朋友可以参考下
    2017-04-04
  • 详解spring mvc 请求转发和重定向

    详解spring mvc 请求转发和重定向

    这篇文章主要介绍了详解spring mvc 请求转发和重定向,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • JVM处理未捕获异常的方法详解

    JVM处理未捕获异常的方法详解

    这篇文章主要给大家介绍了关于JVM处理未捕获异常的相关资料,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • Spring cloud restTemplate 传递复杂参数的方式(多个对象)

    Spring cloud restTemplate 传递复杂参数的方式(多个对象)

    这篇文章主要介绍了Spring cloud restTemplate 传递复杂参数的方式(多个对象),需要的朋友可以参考下
    2018-05-05
  • Java使用Google Zxing生成二维码的例子

    Java使用Google Zxing生成二维码的例子

    本篇文章主要介绍了Java使用Google Zxing生成二维码的例子。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • java实现单人版五子棋游戏

    java实现单人版五子棋游戏

    这篇文章主要为大家详细介绍了java实现五子棋小游戏的相关资料,十分简单实用,有不错的参考借鉴价值,推荐给大家,需要的朋友可以参考下
    2016-02-02
  • Mybatis调用视图和存储过程的方法

    Mybatis调用视图和存储过程的方法

    MyBatis支持普通sql的查询、视图的查询、存储过程调用,是一种非常优秀的持久层框架。接下来通过本文给大家介绍mybatis调用视图和存储过程的方法,感兴趣的朋友一起看看吧
    2016-10-10
  • Spring AOP手动实现简单动态代理的代码

    Spring AOP手动实现简单动态代理的代码

    今天小编就为大家分享一篇关于Spring AOP手动实现简单动态代理的代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03

最新评论