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. 无需搭建环境,零门槛带你体验Open-Sora文生视频应用

    本文分享自华为云社区<Open-Sora 文生视频原来在AI Gallery上也能体验了>,作者:码上开花_Lancer. 体验链接:Open-Sora 文生视频案例体验 不久前,Open ...

  2. C#.NET AES ECB 加密

    加密: /// <summary> /// 加密 /// </summary> /// <param name="content">要加密的串& ...

  3. redis数据类型篇

    redis数据类型官网资料,https://redis.io/docs/manual/data-types/ 生产环境下的redis实况图 超哥这个redis实例里,db0库有140万个key. 1. ...

  4. Java POI 生成Word文档

    maven的pom <dependency> <groupId>org.apache.poi</groupId> <artifactId>ooxml-s ...

  5. Spring事务隔离级别和传播机制

    引言 什么是事务? 在理解事务之前,我们要先了解事务的基本作用 比如在生活中有这样一个场景----取钱,每个人应该都干过的事 在ATM机上取钱,1.输入密码----2.输入金额----3.银行扣钱-- ...

  6. SDL3 入门(1):Hello, SDL3!

    在本系列中我们使用 Windows Terminal + Powershell 组合作为我们在 Windows 系统下的终端工具,Windows 11 自带该环境.你也可以使用任意自己喜欢的终端环境代 ...

  7. Mysql慢sql优化

    Mysql慢sql优化 index1.MySQL的执行过程2.索引的定义3.MySQL执行计划explain or desc4.索引使用/创建规则5.弊端6.设计规范7.SQL建议 1. MySQL ...

  8. Libgdx游戏开发(4)——显示中文文字

    原文: Libgdx游戏开发(4)--显示中文文字-Stars-One的杂货小窝 本文代码示例采用kotlin代码进行讲解,且需要有libgdx入门基础 这里主要介绍关于在Libgdx显示文字的2种方 ...

  9. C#拾贝

    C#拾贝 C#C#技巧C#进阶 不积跬步无以至千里,不积小流无以成江河 C#拾贝 一.Linq 1.以...开头 StartsWith Repeater1.DataSource=con.Users.W ...

  10. VUE CLI中使用Jquery无法获取到dom节点

    mounted 类型:Function 详细: 实例被挂载后调用,这时 el 被新创建的 vm.$el 替换了.如果根实例挂载到了一个文档内的元素上,当 mounted 被调用时 vm.$el 也在文 ...