这篇文章主要介绍了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服务的用户接口,共两个方法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,访问 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中文网其他相关文章!

本文讨论了使用Maven和Gradle进行Java项目管理,构建自动化和依赖性解决方案,以比较其方法和优化策略。

本文使用Maven和Gradle之类的工具讨论了具有适当的版本控制和依赖关系管理的自定义Java库(JAR文件)的创建和使用。

本文讨论了使用咖啡因和Guava缓存在Java中实施多层缓存以提高应用程序性能。它涵盖设置,集成和绩效优势,以及配置和驱逐政策管理最佳PRA

本文讨论了使用JPA进行对象相关映射,并具有高级功能,例如缓存和懒惰加载。它涵盖了设置,实体映射和优化性能的最佳实践,同时突出潜在的陷阱。[159个字符]

Java的类上载涉及使用带有引导,扩展程序和应用程序类负载器的分层系统加载,链接和初始化类。父代授权模型确保首先加载核心类别,从而影响自定义类LOA


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

WebStorm Mac版
好用的JavaScript开发工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器