这篇文章主要介绍了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开发的实例详解的详细内容。