springboot集成springdoc-openapi(模拟前端请求)

目录

描述---痛点

Springfox对比springdoc-openapi

1. 成熟度和维护性:

2. 依赖和配置:

3. 注解和使用方式:

4. 特性和扩展性:

应用目录结构

pom文件

新增测试controller

StaffController

YUserController

启动测试看下

验证swagger

yml中添加配置

配置OpenApiConfig 

验证配置swagger

验证接口

无参

有参

优化下界面openapi

添加jar包

 验证结果


描述---痛点

我们项目中很多时候都会用到swagger swagger2 (以下全部称swagger)
当我们配置Springboot集成swagger时,要选对应的版本才可以,不然就会报各种错误,版本不匹配,或高或低
例如
Application run failed

org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException

java.lang.IllegalStateException: Cannot set parent bean factory to self

等等。就会很麻烦

或者是当我们去升级spring-boot的时候  也会遇到这些问题,这时我们可以尝试更改用springdoc-openapi-ui取替代swagger

springdoc-openapi-ui中间已经包含了swagger也就是说,使用springdoc-openapi-ui是可以替代的。他的配置相对的话就比较简单

配置起来也不会很麻烦,我们看下是如何配置

Springfox对比springdoc-openapi

在该片中我用的是springdoc-openapi,相对来说更加适合于我,简单轻量,配置更少一些,还有一点就是直接更喜欢

Springfox和springdoc-openapi都是用于在Spring Boot应用程序中集成OpenAPI和Swagger UI的库。

1. 成熟度和维护性:

- Springfox是一个相对成熟和广泛使用的库,已经存在一段时间,并且有一个活跃的社区进行维护和更新。

- springdoc-openapi是相对较新的库,但也在不断发展和更新,它的目标是提供更简单、更轻量级的集成方式。

2. 依赖和配置:

- Springfox通常需要引入`springfox-boot-starter`等相关依赖,并进行一些配置,以便生成和展示Swagger文档。

- springdoc-openapi通常只需要引入`springdoc-openapi-ui`依赖,并且不需要太多的配置即可生成和展示OpenAPI文档。

3. 注解和使用方式:

- Springfox使用`@Api`、`@ApiOperation`等注解来定义API文档,并提供了一些配置选项来自定义文档生成。

- springdoc-openapi使用`@io.swagger.v3.oas.annotations`包下的注解来定义API文档,它遵循OpenAPI规范,并提供了一些额外的注解来进行更细粒度的控制。

4. 特性和扩展性:

- Springfox提供了一些额外的特性和扩展,如支持Spring Security集成、自定义UI主题等。

- springdoc-openapi也提供了一些特性和扩展,如支持Spring Security集成、自定义UI主题等,但可能相对较少。

如何选择使用Springfox还是springdoc-openapi

如果你需要更成熟、功能更丰富的库,并且对配置和注解的灵活性有更高的要求,那么Springfox可能是一个不错的选择。

如果你更倾向于简单、轻量级的集成方式,并且遵循OpenAPI规范的优先级更高,那么springdoc-openapi可能更适合你。

应用目录结构

pom文件

我用的springboot是2.7.10还是比较新的。

只需要引入springdoc-openapi-ui这一个即可

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.10</version><relativePath/> <!-- lookup parent from repository --></parent><!--Springfox/swagger迁移springdoc-openapi & springdoc-openapi最新版本和springboot应用集成--><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-ui</artifactId><version>1.5.12</version></dependency>
<!-- 可以不引入 --><dependency><groupId>org.reflections</groupId><artifactId>reflections</artifactId><version>0.9.12</version></dependency>
新增测试controller

`@Tag`注解用于指定相关测试controller的API

StaffController
package com.yun.greedy.modules.staff.controller;import com.yun.greedy.modules.staff.entity.Staff;
import com.yun.greedy.modules.staff.service.StaffService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** <p>* 前端控制器* </p>** @author ex_yangqiusheng* @since 2023-06-29*/
@Slf4j
@RestController
@Tag(name = "StaffController测试数据", description = "测试数据验证")
@RequestMapping("/staff")
public class StaffController {@Autowiredprivate StaffService staffService;@GetMapping("/list")public List<Staff> list() {List<Staff> list = staffService.getBaseMapper().selectList(null);log.info("结果值打印--------------------");list.forEach(System.out::println);return list;}}
YUserController
package com.yun.greedy.modules.yuser.controller;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.yun.greedy.modules.yuser.entity.YUser;
import com.yun.greedy.modules.yuser.service.YUserService;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.configurationprocessor.json.JSONException;
import org.springframework.boot.configurationprocessor.json.JSONObject;
import org.springframework.web.bind.annotation.*;import java.util.List;@Tag(name = "YUserController账户操作", description = "账户相关信息")
@RequestMapping("/YUser")
@RestController
public class YUserController {@Autowiredprivate YUserService yUserService;@GetMapping(value = "/queryYUserById")public YUser queryYUserId(Long yId){YUser yUser = yUserService.getById(yId);return yUser;}@GetMapping(value = "/queryYUserByName")public List<YUser> queryYUserName(String name){List<YUser> list = yUserService.getBaseMapper().selectList(new QueryWrapper<YUser>().eq("y_name", name));return list;}@GetMapping(value = "/searchYUser")public YUser searchYUser(Long yId,String yName){YUser yUser = YUser.builder().yId(yId).yName(yName).build();return yUser;}@PostMapping(value = "/postYUser")public YUser queryYUser(@RequestBody JSONObject jsonObject) throws JSONException {long yId = jsonObject.getLong("yId");String yName = jsonObject.getString("yName");YUser yUser = YUser.builder().yId(yId).yName(yName).build();return yUser;}
}
启动测试看下

启动完成,如果不知道如何搭建新项目的,可以借鉴看下这篇文章,从零到一新建项目

https://blog.csdn.net/weixin_59383491/article/details/132596733

验证swagger

http://localhost:8088/swagger-ui/index.html

浏览器输入这个地址,显示这个页面说明swagger正常。

yml中添加配置
springdoc:api-docs:#是否开启文档功能,默认为true,可不配置enabled: trueswagger-ui:# 访问ip:host/api,可直接访问Swagger springdocpath: /api
配置OpenApiConfig 
package com.yun.greedy.config;import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.enums.SecuritySchemeIn;
import io.swagger.v3.oas.annotations.enums.SecuritySchemeType;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.security.SecurityScheme;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.tags.Tag;
import org.reflections.Reflections;
import org.reflections.scanners.SubTypesScanner;
import org.reflections.util.ConfigurationBuilder;
import org.springdoc.core.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RestController;import java.util.Set;/*** 这里的@OpenAPIDefinition 和@SecurityScheme都是springdoc注解,主要声明API信息:标题、版本、许可证、安全性、服务器、标签、安全性和拓展文档信息。* 配置jwt时,@SecurityScheme(type = SecuritySchemeType.HTTP, name = “JWT”, scheme = “bearer”, in = SecuritySchemeIn.HEADER).scheme 还支持basic。* 具体可查看官网文档: https://springdoc.org/index.html*/
@OpenAPIDefinition(security = @SecurityRequirement(name = "Authorization"))
@SecurityScheme(type = SecuritySchemeType.APIKEY, name = "Authorization", scheme = "Authorization", in = SecuritySchemeIn.HEADER)
@Configuration
public class OpenApiConfig {private String title = "寒舞";//标题private String group = "group";//分组名称private String description = "被你捧做神明的人,怎会低头看尘埃里的你";//简介private String version = "ver_1.0.0";//版本private String termsOfService = "https://blog.csdn.net/weixin_59383491";//服务Urlprivate String contactName = "一百减一是零";//作者@Beanpublic OpenAPI springOpenAPI() {return new OpenAPI().info(getInfo());}public Info getInfo() {return new Info().title(title).description(description).version(version).termsOfService(termsOfService).license(buildLicense()).contact(buildContact());}public Contact buildContact() {return new Contact().name(contactName).email("517306474@qq.com")//Your API Contact Email.url("https://blog.csdn.net/weixin_59383491");//Your API Contact URL}public License buildLicense() {return new License().name("APACHE LICENSE, VERSION 2.0")//许可证.url("https://www.apache.org/licenses/LICENSE-2.0.html");}@Beanpublic GroupedOpenApi publicApi() {return GroupedOpenApi.builder().group(group).pathsToMatch("/YUser/**","/staff/**")//API路径,不是类路径//这里是添加对应标签/*.addOpenApiCustomiser(openApi -> {Tag staffTag = new Tag();staffTag.setName("myController");//标签名称staffTag.setDescription("验证一下所有Controller");//描述// 指定某个包中的所有controllerString packagePath = "com.yun.greedy.modules.staff.controller";Set<Class<?>> controllerClasses = getControllerClasses(packagePath);for (Class<?> controllerClass : controllerClasses) {String controllerName = controllerClass.getSimpleName();staffTag.addExtension("x-controller-" + controllerName, controllerClass.getName());}// 指定单独的controller
//                    String controllerName = "YourControllerName";
//                    Class<?> controllerClass = getControllerClass(packagePath, controllerName);
//                    if (controllerClass != null) {
//                        staffTag.addExtension("x-controller-" + controllerName, controllerClass.getName());
//                    }if (null != openApi.getTags()){openApi.getTags().add(staffTag);} else {openApi.addTagsItem(staffTag);//添加标签}})*/.build();}//显式地配置扫描器private Reflections reflectionsConf(String packagePath){return new Reflections(new ConfigurationBuilder().forPackages(packagePath).addScanners(new SubTypesScanner()));}// 获取某个包中的所有controller类private Set<Class<?>> getControllerClasses(String packagePath) {Reflections reflections = reflectionsConf(packagePath);return reflections.getTypesAnnotatedWith(RestController.class);}// 获取单独的controller类private Class<?> getControllerClass(String packagePath, String controllerName) {Reflections reflections = reflectionsConf(packagePath);Set<Class<?>> controllerClasses = reflections.getTypesAnnotatedWith(RestController.class);for (Class<?> controllerClass : controllerClasses) {if (controllerClass.getSimpleName().equals(controllerName)) {return controllerClass;}}return null;}}
验证配置swagger

http://localhost:8088/api

重启应用,输入此地址,展示以下页面显示配置成功!

验证接口
无参

try一下

执行结果

有参

执行结果

现在看起来是没有问题的,配置,展示,执行结果都是正常,但是这个页面看着削为有点简陋

优化下界面openapi
添加jar包
<!--美化swagger--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-springdoc-ui</artifactId><version>3.0.3</version></dependency>

  http://localhost:8088/doc.html

重启应用,输入地址,展示以下界面就可以了。

 验证结果

OK执行成功,到此就算是完成了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/236062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java基础回顾——注解

文章目录 介绍定义注解处理注解使用注解 介绍 注解Annotation&#xff1a;是放在Java源码的类、方法、字段、参数前的一种特殊注释 注释会被编译器直接忽略&#xff0c;注解则可以被编译器打包进入class文件&#xff0c;因此&#xff0c;注解是一种用作标注的“元数据”。 作…

PHP HTTPoxy CGI 应用程序漏洞 CVE-2016-5385

HTTPoxy CGI 应用程序漏洞 CVE-2016-5385 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议 漏洞名称 漏洞描述 在Oracle Communications BRM 10.x/12.x&#xff08;云软件&#xff09;中发现漏洞。它已经被宣布为关键。此漏洞影响组件用户数据库的未…

Linux笔记---用户和权限管理基本命令介绍

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux学习 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 ​编辑 前言&#xff1a; 命令&#xff1a; whoami&#xff1a; passwd&#xff1a; useradd&#xff1a; userdel&#xff1a; chm…

华为交换配置OSPF与BFD联动

实验拓扑 组网需求 如图所示&#xff0c;SW1、SW2和SW3之间运行OSPF&#xff0c;SW1和SW2之间的交换机仅作透传功能。现在需要SW1和SW2能够快速感应它们之间的链路状态&#xff0c;当链路SW1-SW2发生故障时&#xff0c;业务能快速切换到备份链路SW1-SW3-SW2上 配置思路 采用…

文件的基本管理

目录 一、Linux系统目录结构和相对/绝对路径 &#xff08;一&#xff09;系统目录结构 &#xff08;二&#xff09;相对路径和绝对路径 1.绝对路径 2.相对路径 &#xff08;三&#xff09;通配符的作用 二、创建、复制、删除文件&#xff0c;rm -rf /意外事故 &#xf…

说说对React Hooks的理解?解决了什么问题?

面试官&#xff1a;说说对React Hooks的理解&#xff1f;解决了什么问题&#xff1f; 一、是什么 Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性 至于为什么引入hook&#xff0c;官方给出的动机是解决长时间使用和维护…

山景DU561—32位高性能音频处理器(DSP)芯片

音频处理可以更好地捕捉和处理声音和音乐&#xff1b;而DSP音频处理芯片是一种利用数字信号处理技术进行音频处理的专用芯片&#xff1b;可用于多种应用&#xff0c;从音乐拾音到复杂的音频信号处理&#xff0c;和声音增强。 由工采网代理的山景DU561是一款集成多种音效算法高…

C# 获取本机IP地址的方法

在C#环境中&#xff0c;要获取本机的IP地址&#xff0c;可以使用以下方法&#xff1a; 1、使用NetworkInterface类和IPAddress类&#xff1a; using System; using System.Net; using System.Net.NetworkInformation;class Program {static void Main(){// 获取本地计算机上的…

08、基于LunarLander登陆器的DDQN强化学习(含PYTHON工程)

08、基于LunarLander登陆器的DDQN强化学习&#xff08;含PYTHON工程&#xff09; LunarLander复现&#xff1a; 07、基于LunarLander登陆器的DQN强化学习案例&#xff08;含PYTHON工程&#xff09; 08、基于LunarLander登陆器的DDQN强化学习&#xff08;含PYTHON工程&#xf…

登录注册表单路由切换 - 登录注册开发入门(6)

登录注册表单路由切换 - 登录注册开发入门(6) 教程目标 完成注册表单的搭建&#xff0c;并实现与登录表单的无缝切换。 教程步骤 创建路由容器 在页面中添加一个路由容器。路由容器需要与路由的页面容器配合使用。 添加页面组件 在路由容器下方添加两个页面组件&#xff0c;…

普通虚拟主机如何安装SSL证书?

在今天的互联网世界中&#xff0c;保护网站数据安全和用户隐私已经成为了每个网站拥有者的重要任务。尽管安装SSL证书在普通虚拟主机环境中可能会有一些挑战&#xff0c;但通过正确的步骤和配置&#xff0c;您仍然可以为您的网站提供更高级别的安全保护。普通虚拟主机如何安装S…

DTC营销新模式,创新商业引领裂变营销新潮流的玩法!

DTC营销新模式&#xff0c;创新商业引领裂变营销新潮流的玩法&#xff01; 随着市场竞争的加剧&#xff0c;企业寻求创新的营销模式以突破困境&#xff0c;脱颖而出。其中&#xff0c;DTC&#xff08;Direct-to-Consumer&#xff0c;直接面向消费者&#xff09;营销新模式应运…

【mysql】MySql中死锁是什么?怎么解决?

在MySQL中,死锁是指两个或多个事务相互等待对方持有的资源,导致它们无法继续执行并永远地被阻塞的情况。每个事务都持有一些资源,并且等待其他事务释放资源,但由于循环依赖关系,导致所有事务都无法继续执行,从而形成死锁。 当发生死锁时,MySQL会自动检测到它,并选择其…

CentOS 7 制作openssh 9.6 rpm包更新修复安全漏洞 —— 筑梦之路

2023年12月18日 openssh 发布新版9.6p1&#xff0c;详细内容阅读OpenSSH: Release Notes 背景说明 之前也写过多篇制作openssh rpm包的文章&#xff0c;为何要重新来写一篇制作openssh 9.6版本的&#xff1f; openssh 9.6 rpm包制作和之前存在区别&#xff0c;对于CentOS 7来…

spring之面向切面:AOP(2)

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

【Python】函数

一、函数介绍 二、函数的定义 三、函数的参数 四、函数的返回值 五、函数说明文档 六、函数的嵌套调用 七、变量的作用域 一、函数介绍 函数的使用 函数的作用 函数 函数&#xff1a;是组织好的&#xff0c;可重复使用的&#xff0c;用来实现特定功能的代码段。 input()、p…

文件批量管理,按单值大小归类保存,提升工作效率与便捷性!

你是否曾经遇到过需要批量管理大量文件&#xff0c;但却因为文件大小不一而感到混乱&#xff1f;你是否希望有一种方法能够将这些文件按照单值大小进行归类保存&#xff0c;以便更方便地管理和查找&#xff1f;现在&#xff0c;我们有一个好消息要告诉你&#xff0c;我们推出了…

Nvm切换nodejs版本

下载地址 Releases coreybutler/nvm-windows GitHub 安装运行 双击安装运行即可 下载速度慢的&#xff0c;可以通过修改配置文件切换国内下载镜像 node_mirror: https://npm.taobao.org/mirrors/node/ npm_mirror: CNPM Binaries Mirror 打开安装目录&#xff0c;修改se…

【个人记录】Ubuntu做网络路由+强化学习项目debug

本篇并不介绍做整个项目的过程&#xff0c;仅仅是个人在科研过程中的debug记录和心得。希望某个部分是你正需要的解决方案。 第一部分&#xff1a;在服务器上安装mininet mininet是一个在安装过程中比较容易出问题的包。一定要好好看看官方INSTALL文档。Download/Get Started…

easyExcel生成excel并导出自定义样式------添加复杂表头

easyExcel生成excel并导出自定义样式------添加复杂表头 设置合并竖行单元格&#xff0c;表头设置 OutputStream outputStream ExcelUtils.getResponseOutputStream(response, fileName);//根据数据组装需要合并的单元格Map<String, List<String>> strategyMap …