技术员联盟提供win764位系统下载,win10,win7,xp,装机纯净版,64位旗舰版,绿色软件,免费软件下载基地!

当前位置:主页 > 教程 > 服务器类 >

Spring boot+CXF开发WebService Demo教程

来源:技术员联盟┆发布时间:2017-06-09 06:26┆点击:

最近工作中需要用到webservice,而且结合spring boot进行开发,参照了一些网上的资料,配置过程中出现的了一些问题,于是写了这篇博客,记录一下我这次spring boot+cxf开发的webservice的配置过程,仅供参考。

一、本次开发除了用到spring boot基础jar包外,还用到了cxf相关jar包:

<!-- 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>

二、首先我们创建一个实体类,内容是关于用户信息的查询和记录:

import java.io.Serializable; import java.util.Date; public class User implements Serializable { private static final long serialVersionUID = -5939599230753662529L; private String userId; private String username; private String age; private Date updateTime; //getter setter ...... public void setUserId(String userId) { this.userId=userId; } public void setUsername(String username) { this.username=username; } public void setAge(String age) { this.age=age; } public void setUpdateTime(Date updateTime) { this.updateTime=updateTime; } public String getUserId() { return userId; } public String getUserName() { return username; } public String getAge() { return age; } public Date getUpdateTime() { return updateTime; } }

三、接下来我们创建接口类:

import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; import cn.paybay.demo.entity.User; @WebService public interface UserService { @WebMethod String getName(@WebParam(name = "userId") String userId); @WebMethod User getUser(String userId); }

四、有了接口类,那么接下来我们对接口进行实现,也就是接口实现类(也就是业务类)代码:

package cn.paybay.demo.service.impl; import java.util.Date; import java.util.HashMap; import java.util.Map; import javax.jws.WebService; import cn.paybay.demo.entity.User; import cn.paybay.demo.service.UserService; @WebService(targetNamespace="",endpointInterface = "cn.paybay.demo.service.UserService") public class UserServiceImpl implements UserService{ private Map<String, User> userMap = new HashMap<String, User>(); public UserServiceImpl() { System.out.println("向实体类插入数据"); User user = new User(); user.setUserId("411001"); user.setUsername("zhansan"); user.setAge("20"); user.setUpdateTime(new Date()); userMap.put(user.getUserId(), user); user = new User(); user.setUserId("411002"); user.setUsername("lisi"); user.setAge("30"); user.setUpdateTime(new Date()); userMap.put(user.getUserId(), user); user = new User(); user.setUserId("411003"); user.setUsername("wangwu"); user.setAge("40"); user.setUpdateTime(new Date()); userMap.put(user.getUserId(), user); } @Override public String getName(String userId) { return "liyd-" + userId; } @Override public User getUser(String userId) { System.out.println("userMap是:"+userMap); return userMap.get(userId); } }

注释(PS):在发布服务之前,我们要在这里对业务实现类进行一下说明,请大家看下图箭头指向的方框部分

Spring boot+CXF开发WebService Demo教程

下面我来解释一下加上图方框箭头所指代码的目的:

:这是我的业务类所在路径;

:这是我的接口类所在路径;

在不加上图方框箭头所指代码的情况下,你最后发服务的结果是这样的(如下图):

Spring boot+CXF开发WebService Demo教程

并且会在你进行客户端调用的时候回报错:No operation was found with the name {}getUser.那么原因就是:在CXF发布服务的时候,发布的是业务类(UserServiceImpl.java),那么默认的命名空间就会是业务类所在包(路径),而对外界暴露的则是接口类(UserService.java),那么对于客户端调用的时侯,需要按照接口类所在路径进行命名空间的定义。

所以在发布之前我们要在业务类(UserServiceImpl.java)上增加注解,指定命名空间,然后再进行发布,

那么我们最终在加上(图一)方框箭头所指代码情况下,发布服务的结果为下图(请看图三):

Spring boot+CXF开发WebService Demo教程

五、(发布服务)接口类,业务类代码都已经准备好,那么我接下来我就要对webservice服务进行发布:

代码如下: