前言
说起web service最近几年restful大行其道,大有取代传统soap web service的趋势,但是一些特有或相对老旧的系统依然使用了传统的soap web service,例如银行、航空公司的机票查询接口等。
目前就遇到了这种情况,需要在系统中查询第三方提供的soap web service接口,也就是说要将它整合进现有的系统当中。
spring整合CXF本来十分简单,但是因为使用了Spring boot,不想用以前xml一堆配置的方式,那么能否按照Spring boot的风格优雅的进行整合呢?
答案当然是肯定的,但是遍查网上几乎没有这方面的资料,折腾过后觉得还是有必要记录一下,虽然它显得非常的简单。
添加依赖
Maven的项目,首先当然是添加依赖了,除了原先Spring boot的依赖之外,还需要添加cxf依赖:
1
2
3
4
5
6
7
8
9
10
|
< 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对象:
1
2
3
4
5
6
7
8
|
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,一个返回自定义对象:
1
2
3
4
5
6
7
|
有接口当然要有业务代码实现了,这里我们只做简单的演示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
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的方式更加的简洁,所有相关的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
@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生成客户端代码,整合之后就可以像调用本地接口一样使用了。
但是我个人不怎么喜欢这种方式,每个接口都要生成一次还有一堆的代码,感觉比较麻烦。
相对更喜欢传入方法名调用的方式,显得清爽而简洁,以下就是所有代码了:
1
2
3
4
5
6
|
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[]中的数据类型就成了这个自定义对象(组件帮你自动生成了这个对象),
但是你本地可能并没有这个类,所以需要自行转换处理,最简单的是新建一个跟返回结果一模一样的类进行强转,当然更好的方式是封装一个通用的,这个不是本文主题就不在这深入讨论了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。
原文链接:http://blog.csdn.net/hj7jay/article/details/51130386
相关文章
- 64M VPS建站:怎样优化以提高网站加载速度? 2025-06-10
- 64M VPS建站:是否适合初学者操作和管理? 2025-06-10
- ASP.NET自助建站系统中的用户注册和登录功能定制方法 2025-06-10
- ASP.NET自助建站系统的域名绑定与解析教程 2025-06-10
- 个人服务器网站搭建:如何选择合适的服务器提供商? 2025-06-10
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
-
2025-05-29 71
-
2025-05-29 29
-
2025-05-29 89
-
2025-06-04 78
-
2025-05-25 54