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/

Spring Boot 开发 WebService 服务的更多相关文章

  1. Spring boot 开发WebService遇到的问题之一

    当pom.xml文件中的配置: <artifactId>spring-boot-starter-parent</artifactId><version>2.0.6. ...

  2. Spring Boot开发RESTful接⼝服务及单元测试

    Spring Boot开发RESTful接⼝服务及单元测试 常用注解解释说明: @Controller :修饰class,⽤来创建处理http请求的对象 @RestController :Spring ...

  3. Spring Boot SOAP Webservice例子

    前言 本文将学习如何利用Spring boot快速创建SOAP webservice服务: 虽然目前REST和微服务越来越流行,但是SOAP在某些情况下,仍然有它的用武之地: 在本篇 spring b ...

  4. 一文读懂 Spring Boot、微服务架构和大数据治理三者之间的故事

    微服务架构 微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物.互联网时代的产品通常有两类特点:需求变化快和用户群体庞大,在这种情况 ...

  5. 一文读懂spring boot 和微服务的关系

    欢迎访问网易云社区,了解更多网易技术产品运营经验. Spring Boot 和微服务没关系, Java 微服务治理框架普遍用的是 Spring Cloud. Spring Boot 产生的背景,是开发 ...

  6. Spring Boot开发HTTPS协议的REST接口

    Spring Boot开发HTTP的REST接口流程在前文中已经描述过,见<SpringBoot开发REST接口>. 如需要支持HTTPS,只需要在如上基础上进行设置.修改/resourc ...

  7. Spring Boot、微服务架构和大数据

    一文读懂 Spring Boot.微服务架构和大数据治理三者之间的故事 https://www.cnblogs.com/ityouknow/p/9034377.html 微服务架构 微服务的诞生并非偶 ...

  8. Spring Boot 开发微信公众号后台

    Hello 各位小伙伴,松哥今天要和大家聊一个有意思的话题,就是使用 Spring Boot 开发微信公众号后台. 很多小伙伴可能注意到松哥的个人网站(http://www.javaboy.org)前 ...

  9. 天天玩微信,Spring Boot 开发私有即时通信系统了解一下

    1/ 概述 利用Spring Boot作为基础框架,Spring Security作为安全框架,WebSocket作为通信框架,实现点对点聊天和群聊天. 2/ 所需依赖 Spring Boot 版本 ...

随机推荐

  1. AtCoder Beginner Contest 144

    https://atcoder.jp/contests/abc144/tasks/abc144_c #include<bits/stdc++.h> using namespace std; ...

  2. nginx挂了怎么办

    1.什么是502 bad gateway 报错: 简单来说 502 是报错类型代码 bad gateway 错误的网关. 2.产生错误的原因: 连接超时 我们向服务器发送请求 由于服务器当前连接太多, ...

  3. 熬最深的夜喝最劣的酒————浅谈生成器(generator)

    测试(test)def s(): print("stup1") n = "第一步" yield n # 类似于return 但是又不同于 赖克宝,剁一下,跳一下 ...

  4. 【转载】Hadoop面试(1)

    转自:http://www.cnblogs.com/xiaolong1032/p/4504992.html 列举出hadoop常用的一些InputFormat InputFormat是用来对我们的输入 ...

  5. Java compareTo的用法

    compareTo() 方法用于将 Number 对象与方法的参数进行比较.可用于比较 Byte, Long, Integer等. 该方法用于两个相同数据类型的比较,两个不同类型的数据不能用此方法来比 ...

  6. js无法监听input中js改变值的变化

    $(input).on('change',function(){ }) 当使用$(input).val('...');不会触发它的change事件 解决办法一:在改变它的值后,手动触发input的ch ...

  7. 生成树计数 UVA 10766

    //本题题意:首先每个点之间都可达,然后m列举出不可达的,求出最多的生成树方案: //k这个变量是没用的. //公式:ans矩阵=度矩阵-建边矩阵: //度矩阵是当i==j时的,建边矩阵于平时定义可达 ...

  8. opencv静态编译

    在Windows下opencv静态编译. 使用cmake生成visual Studio 2015 解决方案如下图所示: 重点看红色框线里的内容,先编译ALL_BUILD,这样就把所有子项目编译成功.所 ...

  9. Spring 属性依赖注入

    1.1    属性依赖注入 依赖注入方式:手动装配 和 自动装配 手动装配:一般进行配置信息都采用手动 基于xml装配:构造方法.setter方法 基于注解装配: 自动装配:struts和spring ...

  10. 粪发涂墙-tomcat

    tomcat 的 JAVA_OPTS 分析设置 快乐生活你我 2019-08-12 06:07:00 JAVA_OPTS ,顾名思义,是用来设置JVM相关运行参数的变量. 1.JVM:JAVA_OPT ...