WebService 虽然现在大部分互联网企业不太提倡使用,但在以第三方接口为主导的市场,对方来什么接口你还得用什么接口,不可能把接口重写了。例如大部分传统的大型企业都在用 WebService,并且版本还不一样。

本章主要介绍在 Spring Boot 下有常用的整合 WebService 的方法并给出示例。为了方便测试,本章有两个独立的项目

  1. 用户的获取、增加、更新、删除 webservice 服务
  2. 用于调用 1 的webservice 服务的客户端

本项目源码 github 下载

1 新建 Spring Boot Maven 示例工程项目

注意:是用来 IDEA 开发工具

  1. File > New > Project,如下图选择 Spring Initializr 然后点击 【Next】下一步
  2. 填写 GroupId(包名)、Artifact(项目名) 即可。点击 下一步

    groupId=com.fishpro

    artifactId=webservice
  3. 选择依赖 Spring Web Starter 前面打钩。
  4. 项目名设置为 spring-boot-study-webservice.

2 引入依赖 Pom.xml

这里主要是引入 org.apache.cxf

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-spring-boot-starter-jaxws -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.2.5</version>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

3 编写一个用户获取、新增、修改、删除服务

3.1 传输对象 UserDto

通常我们把展示层与服务层之间传输的对象使用Dto后缀来标识。

UserDto(路径 src/main/java/com/fishpro/webservice/dto/UserDto.java)


/**
* 用户传输实体对象 通常我们把展示层与服务层之间传输的对象使用Dto后缀来标识。
* */
public class UserDto { private Integer userId;//用户id
private String userName;//用户名称
private String password;//用户密码
private Integer sex;//用户性别 0女 1男 public Integer getUserId() {
return userId;
} public void setUserId(Integer userId) {
this.userId = userId;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public Integer getSex() {
return sex;
} public void setSex(Integer sex) {
this.sex = sex;
}
}

3.2 用户服务类

UserService 接口类(路径 src/main/java/com/fishpro/webservice/service/UserService.java)

/**
* 用户服务类 必须使用 @WebService
* */
@WebService(targetNamespace = WsConst.NAMESPACE_URI ,name = "userPortType")
public interface UserService {
/**
* 根据用户id获取用户信息
* */
@WebMethod(operationName="getUserById")
UserDto get(@WebParam(name = "id") String id); /**
* 获取全部用户信息
* */
@WebMethod(operationName="getUsers")
List<UserDto> list(); /**
* 获取用户数
* */
@WebMethod(operationName="count")
int count(@); /**
* 新增用户
* */
@WebMethod(operationName="save")
int save(@WebParam(name = "user") UserDto user); /**
* 更新用户
* */
@WebMethod(operationName="update")
int update(@WebParam(name = "user") UserDto user); /**
* 删除用户
* */
@WebMethod(operationName="remove")
int remove(@WebParam(name = "id") Integer id); /**
* 批量删除用户
* */
@WebMethod(operationName="batchRemove")
int batchRemove(@WebParam(name = "ids") Integer[] ids);
}

UserServiceImpl 接口类(路径 src/main/java/com/fishpro/webservice/service/UserServiceImpl.java)


@WebService(
targetNamespace = WsConst.NAMESPACE_URI, //wsdl命名空间
name = "userPortType", //portType名称 客户端生成代码时 为接口名称
serviceName = "userService", //服务name名称
portName = "userPortName", //port名称
endpointInterface = "com.fishpro.webservice.service.UserService")//指定发布webservcie的接口类,此类也需要接入@WebService注解
public class UserServiceImpl implements UserService { @Override
public UserDto get(String id){
if(null==id){
return null;
} List<UserDto> list= getData();
UserDto UserDto=null;
for (UserDto user:list
) {
if(id.equals(user.getUserId().toString())){
UserDto=user;
break;
}
} return UserDto;
} @Override
public List<UserDto> list(){
List<UserDto> list=new ArrayList<>(); list=getData(); return list;
} @Override
public int count(){
return getData().size();
} @Override
public int save(UserDto user){
return 1;
} @Override
public int update(UserDto user){
return 1;
} @Override
public int remove(Integer id){
return 1;
} @Override
public int batchRemove(Integer[] ids){
return 1;
} /**
* 模拟一组数据
* */
private List<UserDto> getData(){
List<UserDto> list=new ArrayList<>(); UserDto UserDto=new UserDto();
UserDto.setUserId(1);
UserDto.setUserName("admin");
list.add(UserDto); UserDto=new UserDto();
UserDto.setUserId(2);
UserDto.setUserName("heike");
list.add(UserDto); UserDto=new UserDto();
UserDto.setUserId(3);
UserDto.setUserName("tom");
list.add(UserDto); UserDto=new UserDto();
UserDto.setUserId(4);
UserDto.setUserName("mac");
list.add(UserDto); return list;
} }

4 服务发布

编写 CxfWebServiceConfig(路径 src/main/java/com/fishpro/webservice/config/CxfWebServiceConfig.java)

import com.fishpro.websevice.service.UserService;
import com.fishpro.websevice.service.impl.UserServiceImpl;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import javax.xml.ws.Endpoint; @Configuration
public class CxfWebServiceConfig { /**
*
* */
@Bean("cxfServletRegistration")
public ServletRegistrationBean dispatcherServlet(){ return new ServletRegistrationBean(new CXFServlet(),"/ws/*");
}
/**
* 申明业务处理类 当然也可以直接 在实现类上标注 @Service
*/
@Bean
public UserService userService() {
return new UserServiceImpl();
} /*
* 非必要项
*/
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
SpringBus springBus = new SpringBus();
return springBus;
} /*
* 发布endpoint
*/
@Bean
public Endpoint endpoint( ) {
EndpointImpl endpoint = new EndpointImpl(springBus(), userService());
endpoint.publish("/user");//发布地址
return endpoint;
}
}

打开浏览器输入 http://localhost:8080/ws/user?wsdl 可以见到发布的效果

如何使用 Spring Boot 调用 WebService ,请阅读 Spring Boot 使用 CXF 调用 WebService 服务

5 问题

  1. cxf 的服务方法中,是不能使用java.util.Map作为参数的,因为本身不支持转换

    cxf对很多复杂类型支持并不友好,建议参数能使用简单的类型,就使用简单的类型

本项目源码 github 下载


参考:

https://github.com/apache/cxf

[https://blog.lqdev.cn/2018/11/12/springboot/chapter-thirty-four/]https://blog.lqdev.cn/2018/11/12/springboot/chapter-thirty-four/

最新文章

  1. windows7下php5.4成功安装imageMagick,及解决php imagick常见错误问题。(phpinfo中显示不出来是因为:1.imagick软件本身、php本身、php扩展三方版本要一致,2.需要把CORE_RL_*.dll多个文件放到/php/目录下面)
  2. vijos[1355]车队过桥问题
  3. 【Visual Studio】在VS2012中使用VSXtra
  4. Uva 12563,劲歌金曲,01背包
  5. Part 86 to 88 Talking about Multithreading in C#
  6. qmake使用实践:包含动态库的Qt4工程
  7. 浅谈JavaWEB入门必备知识之Servlet入门案例详解
  8. 深入理解Mysql数据库主从延迟
  9. [USACO07NOV]牛继电器Cow Relays
  10. ueditor 插件集成到 xadmin 中的相关操作
  11. javascript Base64转码解码
  12. 手写AVL 树(上)
  13. C#关于多线程及线程同步 lock锁的应用
  14. LeetCode 766 Toeplitz Matrix 解题报告
  15. using强制对象清理资源 【转】
  16. Saiku二次开发获取源代码在本地编译(五)
  17. 手写Spring框架学习笔记
  18. java网络编程Socket通信详解
  19. js 数组复制问题
  20. WCF transport-and-message-security

热门文章

  1. Java数据处理,Map中数据转double并取小数点后两位
  2. 修正_typora文档复制到博客图片失效
  3. php提供下载服务实例
  4. 6_11 四分树(UVa297)&lt;四分树&gt;
  5. node学习之express(1)
  6. bugku web 5
  7. vue 生命钩子周期之理解
  8. 主席树 模板题 luogu([POI2014]KUR-Couriers)
  9. caffe_ocr开源项目学习笔记
  10. Codeforces Round #618 (Div. 1)C(贪心)