前言
说起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服务的用户接口,共两个方法getName和getUser,一个返回普通的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整合UEditor的示例代码,包括了SpringBoot整合UEditor的示例代码的使用技巧和注意事项,需要的朋友参考一下 当前开发项目涉及到富文本框,了解了不少富文本编辑器之后,最终决定使用度娘的UEditor。原因:功能强大,并且自带适配java后端的图片和视频上传。 项目地址 不多说,上一下该项目的地址: http://ueditor.baidu.com/
本文向大家介绍SpringBoot整合Swagger的方法示例,包括了SpringBoot整合Swagger的方法示例的使用技巧和注意事项,需要的朋友参考一下 依赖 配置类 启动类 在springBoot的启动类上添加一个注解即可配置成功: @EnableSwagger2 访问api的路径 http://ip/projectName/swagger-ui.html 注解说明 @Api 标注在类上,
本文向大家介绍springBoot 与neo4j的简单整合示例,包括了springBoot 与neo4j的简单整合示例的使用技巧和注意事项,需要的朋友参考一下 Neo4j简介 Neo4j是基于java语言实现的世界领先的图形数据库, 是一个高性能的图形存储,具有成熟和强大的数据库所需的所有功能,如友好的查询语言(Cypher)和ACID事务。对于许多应用程序,与关系数据库相比,Neo4j提供了数量
本文向大家介绍SpringBoot整合Mybatis注解开发的实现代码,包括了SpringBoot整合Mybatis注解开发的实现代码的使用技巧和注意事项,需要的朋友参考一下 官方文档: https://mybatis.org/mybatis-3/zh/getting-started.html SpringBoot整合Mybatis 引入maven依赖 (IDEA建项目的时候直接选就可以了) 配置
本文向大家介绍详解SpringBoot开发案例之整合定时任务(Scheduled),包括了详解SpringBoot开发案例之整合定时任务(Scheduled)的使用技巧和注意事项,需要的朋友参考一下 来来来小伙伴们,基于上篇的邮件服务,定时任务就不单独分项目了,天然整合进了邮件服务中。 不知道,大家在工作之中,经常会用到那些定时任务去执行特定的业务,这里列举一下我在工作中曾经使用到的几种实现。 任
本文向大家介绍springboot整合Mybatis、JPA、Redis的示例代码,包括了springboot整合Mybatis、JPA、Redis的示例代码的使用技巧和注意事项,需要的朋友参考一下 引言 在springboot 项目中,我们是用ORM 框架来操作数据库变的非常方便。下面我们分别整合mysql ,spring data jpa 以及redis 。让我们感受下快车道。 我们首先创建一