ApacheCXF框架对WSDL的信息几乎完全屏蔽了

能够更快速更方便的构建WebService

这里参考的视频地址是:

https://www.bilibili.com/video/BV1Kz4y1f78f

首先创建一个POM工程:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<modules>
<module>JAX-WS</module>
<module>JAX-RS</module>
</modules> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
</parent> <groupId>cn.cloud9</groupId>
<artifactId>Springboot-CXF</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging> </project>

一、JAX-WS案例

创建子工程JAX-WS

依赖坐标:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>Springboot-CXF</artifactId>
<groupId>cn.cloud9</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion> <artifactId>JAX-WS</artifactId> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.1.11</version>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
</dependencies> <properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties> </project>

创建普通的业务层资源:

package cn.cloud9.po;

import lombok.Data;

/**
* @author OnCloud9
* @description
* @project Springboot-CXF
* @date 2022年04月23日 16:50
*/
@Data
public class User {
private Integer code;
private String name;
private String password;
}

接口,标记为Web服务接口

package cn.cloud9.intf;

import cn.cloud9.po.User;

import javax.jws.WebService;
import java.util.List; @WebService
public interface UserService {
boolean saveUser(User user);
boolean deleteUser(User user);
boolean updateUser(User user);
List<User> listUsers();
User findUserById(Integer code);
}

实现类

package cn.cloud9.intf;

import cn.cloud9.po.User;
import org.springframework.stereotype.Service; import java.util.ArrayList;
import java.util.List; /**
* @author OnCloud9
* @description
* @project Springboot-CXF
* @date 2022年04月23日 16:53
*/
@Service("userService")
public class UserServiceImpl implements UserService{
static List<User> userList; static {
userList = new ArrayList<>();
for (int i = 1; i < 11; i++) {
User user = new User();
user.setCode(1000 + i);
user.setName("user - " + user.getCode());
user.setPassword("123456");
userList.add(user);
}
} public UserServiceImpl() {
}
@Override
public boolean saveUser(User user) {
return null != user;
} @Override
public boolean deleteUser(User user) {
return null != user;
} @Override
public boolean updateUser(User user) {
return null != user;
} @Override
public List<User> listUsers() {
return userList;
} @Override
public User findUserById(Integer code) {
return userList.stream().filter(user -> user.getCode().equals(code)).findFirst().get();
}
}

JaxWsConfig配置类

这里有一个服务总线Bean,类似Controller的概念,

但是所有服务都需要进过这个总Controller发布服务

package cn.cloud9.config;

import cn.cloud9.intf.UserService;
import org.apache.cxf.Bus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import javax.xml.ws.Endpoint; /**
* @author OnCloud9
* @description
* @project Springboot-CXF
* @date 2022年04月23日 16:58
*/
@Configuration
public class JaxWsConfig {
/**
* 业务总线
*/
@Autowired
private Bus bus; @Autowired
private UserService userService; @Bean
public Endpoint createEndpoint() {
final EndpointImpl endpoint = new EndpointImpl(bus, userService);
endpoint.publish("/userService");
return endpoint;
}
}

启动类:

这个服务没有任何的配置文件

package cn.cloud9;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; /**
* @author OnCloud9
* @description
* @project Springboot-CXF
* @date 2022年04月23日 16:50
*/
@SpringBootApplication
public class JaxWsApplication {
public static void main(String[] args) {
SpringApplication.run(JaxWsApplication.class, args);
}
}

启动成功后,可以访问此地址查看WSDL的资源描述

http://localhost:8080/services/userService?wsdl

JaxWs客户端调用:

客户端需要对应的PO和接口一致,这里CXF会对WS进行封装

屏蔽之前许多内容,只需要提供WS的借口地址即可

另外注意一点,Bus会默认追加一个路径前缀,/services

import cn.cloud9.intf.UserService;
import cn.cloud9.po.User;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; /**
* @author OnCloud9
* @description
* @project Springboot-CXF
* @date 2022年04月23日 17:04
*/
public class JaxWsTest {
public static void main(String[] args) {
final JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
factoryBean.setAddress("http://localhost:8080/services/userService");
factoryBean.setServiceClass(UserService.class);
final Object o = factoryBean.create();
UserService userService = (UserService) o; System.out.println(userService.saveUser(new User()));
System.out.println(userService.listUsers());
final User userById = userService.findUserById(1005);
System.out.println(userById);
}
}

得到WS接口代理的实例,就可以调用服务端了

二、JAX-RS案例

新建子工程JAX-RS:

由于是通过Rest风格调用,服务的调用完全可以按照Http的方式使用

这里多出的组件是为了响应JSON化,否则默认响应SOAP数据

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>Springboot-CXF</artifactId>
<groupId>cn.cloud9</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion> <artifactId>JAX-RS</artifactId> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxrs</artifactId>
<version>3.1.11</version>
</dependency> <dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
<version>3.1.11</version>
</dependency> <dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.3.7</version>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
</dependencies> <properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties> </project>

PO,和实现类不需要变更,CXF对REST的支持是提供了这些HTTP的注解

定义在接口上面:

简单数据类型是直接返回的,像PO这样的数据类型,需要通过

@Produces({MediaType.APPLICATION_JSON}) 注解处理返回数据

package cn.cloud9.intf;

import cn.cloud9.po.User;

import javax.jws.WebService;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.util.List; @WebService
public interface UserService { @POST
@Path("/save")
boolean saveUser(User user); @DELETE
@Path("delete/{id}")
boolean deleteUser(@PathParam("id") Integer code); @PUT()
@Path("/update")
boolean updateUser(User user); @GET
@Path("/list")
@Produces({MediaType.APPLICATION_JSON})
List<User> listUsers(); @GET
@Path("/find/{id}")
@Produces(MediaType.APPLICATION_JSON)
User findUserById(@PathParam("id") Integer code);
}

补充一下,PO需要打上@XmlRootElement注解

package cn.cloud9.po;

import lombok.Data;

import javax.xml.bind.annotation.XmlRootElement;

/**
* @author OnCloud9
* @description
* @project Springboot-CXF
* @date 2022年04月23日 16:50
*/
@Data
@XmlRootElement
public class User {
private Integer code;
private String name;
private String password;
}

JaxRsConfig并没有太大差别 

package cn.cloud9.config;

import cn.cloud9.intf.UserService;
import org.apache.cxf.Bus;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* @author OnCloud9
* @description
* @project Springboot-CXF
* @date 2022年04月23日 17:30
*/
@Configuration
public class JaxRsConfig {
@Autowired
Bus bus; @Autowired
private UserService userService; @Bean
public Server createServer() {
final JAXRSServerFactoryBean factoryBean = new JAXRSServerFactoryBean();
factoryBean.setAddress("/userService");
factoryBean.setBus(bus);
factoryBean.setServiceBean(userService);
return factoryBean.create();
}
}

 

JaxRS客户端调用:

因为是Rest接口,所以可以直接使用Postman来发送请求调用了

【WSDL】04 SpringBoot整合CXF的更多相关文章

  1. 【SpringBoot】04.SpringBoot整合Filter的两种方式

    SpringBoot整合Filter过滤器的两种方式: 1.通过扫描注解完成Filter组件注册 创建一个类,实现Filter接口,实现doFilter()方法 在该类使用注解@WebFilter,设 ...

  2. springboot 整合 CXF 版本异常 java.lang.NoClassDefFoundError:ServletRegistrationBean

    在使用SpringBoot 项目整合webservice组件 CXF的时候,在启动时,抛出异常如下,查阅资料初步判断为版本问题.升级到高版本后正常启动. cxf 刚开始使用版本  3.1.7 后更新为 ...

  3. Springboot整合cxf后不能访问controller,不能访问接口

    参考版本 springboot 1.4.X <=========> cxf-spring-boot-starter-jaxws 3.1.X springboot 1.5.X <=== ...

  4. SpringBoot整合cxf发布webService

    1. 看看项目结构图 2. cxf的pom依赖 1 <dependency>2 <groupId>org.apache.cxf</groupId>3 <art ...

  5. spring-boot整合Cxf的webservice案例

    1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.Maven Plugin管理 <?xml version="1.0&q ...

  6. Spring整合CXF,发布RSETful 风格WebService(转)

    Spring整合CXF,发布RSETful 风格WebService 这篇文章是承接之前CXF整合Spring的这个项目示例的延伸,所以有很大一部分都是一样的.关于发布CXF WebServer和Sp ...

  7. Spring整合CXF,发布RSETful 风格WebService

    原文地址:http://www.cnblogs.com/hoojo/archive/2012/07/23/2605219.html 这篇文章是承接之前CXF整合Spring的这个项目示例的延伸,所以有 ...

  8. SpringBoot2.1.6 整合CXF 实现Webservice

    SpringBoot2.1.6 整合CXF 实现Webservice 前言 最近LZ产品需要对接公司内部通讯工具,采用的是Webservice接口.产品框架用的SpringBoot2.1.6,于是采用 ...

  9. Springboot整合webservice

    Springboot整合webservice 2019-12-10 16:34:42 星期二 WebService是什么 WebService是一种跨编程语言和跨操作系统平台的远程调用技术,服务之间的 ...

  10. SpringBoot整合Apache-CXF实践

    一.Apache CXF是什么? Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS . ...

随机推荐

  1. itest work(爱测试) 开源一站式接口测试&敏捷测试工作站 9.0.5. Rc4

    (一)itest work 简介 itest work (爱测试)  一站式工作站让测试变得简单.敏捷,"好用.好看,好敏捷" ,是itest wrok 追求的目标.itest w ...

  2. 第一次至第三次PTAJava大作业分析

    (1)前言: 三次题目集的知识点: 正则表达式(Regular Expression,简称Regex或RegExp)是一个强大的文本处理工具,用于匹配.查找和替换字符串.以下是正则表达式的主要知识点总 ...

  3. linux,curl命令发送各类请求详解

    当你经常面对api时,curl将是你重要学习的工具,因为curl可以让你不需要浏览器也能作为Http客户端发送请求.而且它是跨平台的,Linux.Windows.Mac都会执行的很好. 一.curl ...

  4. 增补博客 第六篇 python 电子算盘

    珠算测试器 题目描述]设计一个珠算测试器,要求能够完成珠算加减法的测试.具体的要求功能如下:(1)用户启动测试,输入用户名后系统随机生成特定数目的加减法测试题:(2) 要求测试使用表盘式或数字时秒表进 ...

  5. mysql 联合表查询从表即使有索引依然ALL的一个原因-索引ALL解决,字符编码方式不一致导致全表搜索

    mysql 联合表查询从表即使有索引依然ALL的一个原因-索引ALL解决,字符编码方式不一致导致全表搜索那就是主表和从表的关联字段的编码方式不一样!!! 产生的现象: 解决之后,正确的使用了t2.or ...

  6. spring与设计模式之一工厂模式

    大家都说要多阅读spring的代码,这非常在理,毕竟spring的代码是许许多多杰出工程师的结晶,是业界多年的累积. 最近也不是非常忙,所以准备记录一系列的相关代码. 工厂模式是所有人都会的模式,是最 ...

  7. ENSP的VirtualBox虚拟网卡不能用

    VirtualBox 安装好后本地会新建一个名为 "VirtualBox Host-Only Network" 的虚拟网卡,虚拟机可以通过这个虚拟网卡网卡和物理机通信.但ENSP有 ...

  8. 【golang】json数据中复杂key的处理

    例1 type Transport struct { Time string Id int } func main() { //将struct的切片包装成json格式 var st []Transpo ...

  9. Java面试知识点(五)hashmap、hashtable和hashset

    1. 关于 HashMap 的一些说法: a) HashMap 实际上是一个 "链表散列" 的数据结构,即数组和链表的结合体.HashMap 的底层结构是一个数组,数组中的每一项是 ...

  10. 我又学会了使用Range实现网络文件下载的断点续传

    目录 前言 1.Range请求头 1.1.概述 1.2.使用限制 1.3.范围请求 1.4.预防资源变更 2.断点续传下载实现 2.1.流程设计 2.2.代码实现 2.3.运行结果 3.RandomA ...