SwaggerUI增加公共的Global全局Header
SwaggerUI 增加公共的Global全局Header
为了调试方便, 想要在 SwaggerUI 的 “Try it out” 页面中增加一个认证 Header, 一个个接口添加注解就太麻烦了,有没有什么方式可以全局生成呢? 网上找了很多资料都不生效, 最后终于搞定了, 所以才有了这篇文章。
实现后的效果图如下所示:
简介
SwaggerUI 是一个自动为 SpringMVC Controller 接口生成接口文档的框架。 还通过注解添加额外的备注,提供更友好的信息。
老版本的 Swagger UI 增加Header配置, 使用的是 Docket
, 可以参考: Global Header in Swagger-Ui Spring-Boot
SwaggerUI, 现在改名叫做 springdoc-openapi, 相关的属性配置可以参考:
https://springdoc.org/properties.html
普通的SpringBoot项目, 可以在 pom.xml
中使用如下依赖引入 SwaggerUI :
<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-ui</artifactId><version>1.7.0</version>
</dependency>
简单的配置示例为:
springdoc:api-docs:# 启用 swaggerUIenabled: true # 启用分组groups:enabled: true # 指定需要扫描的包packages-to-scan: com.cncounter swagger-ui:path: doc.htmlgroup-configs:- group: '1-前端接口'paths-to-match: /api/**- group: '2-系统内部接口'paths-to-match: /inter/**- group: '3-定时任务接口'paths-to-match: /job/**- group: '4-其他接口'paths-to-exclude:- /api/**- /inter/**- /job/**
问题描述
为了调试方便, 想要在 “Try it out” 页面中增加一个认证 Header.
排查过程
SpringBoot方式的配置文件, 提供了 group-configs
选项, 这种方式目前只支持简单的配置, 不支持自定义行为;
最后在 Github 找到一个方案:
链接: Global headers aren’t appearing in the Swagger UI #466
代码为:
@Bean
public OpenApiCustomiser customerGlobalHeaderOpenApiCustomiser() {return openApi -> openApi.getPaths().values().stream().flatMap(pathItem -> pathItem.readOperations().stream()).forEach(operation -> operation.addParametersItem(new HeaderParameter().$ref("#/components/headers/Version")));
}
简单一试, 没有生效。
增加了日志调试, 发现对应的Bean确实生成了, 但是没有调用。
解决方案
但是这哥们的方案也提供了一些思路。
按照Spring的套路, 应该是需要自己注册Bean, 于是翻阅代码, 搜索 OpenApiCustomiser
, 找到了 GroupedOpenApi
类。
又找到了一篇Swagger老版本和新版本迁移的注解变化, 可参考:
Migrating from SpringFox
里面提到:
Replace swagger 2 annotations with swagger 3 annotations (it is already included with springdoc-openapi-ui dependency). Package for swagger 3 annotations is io.swagger.v3.oas.annotations.
@Api → @Tag@ApiIgnore → @Parameter(hidden = true) or @Operation(hidden = true) or @Hidden@ApiImplicitParam → @Parameter@ApiImplicitParams → @Parameters@ApiModel → @Schema@ApiModelProperty(hidden = true) → @Schema(accessMode = READ_ONLY)@ApiModelProperty → @Schema@ApiOperation(value = "foo", notes = "bar") → @Operation(summary = "foo", description = "bar")@ApiParam → @Parameter@ApiResponse(code = 404, message = "foo") → @ApiResponse(responseCode = "404", description = "foo")
那我们就加上 GroupedOpenApi 配置呗,
具体的配置代码为:
package com.cncounter.web.config;import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.PathItem;
import io.swagger.v3.oas.models.Paths;
import io.swagger.v3.oas.models.parameters.HeaderParameter;
import lombok.extern.slf4j.Slf4j;
import org.springdoc.core.GroupedOpenApi;
import org.springdoc.core.customizers.OpenApiCustomiser;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.Collection;
import java.util.List;@Slf4j
@Configuration
public class SwaggerConfig {@Beanpublic OpenApiCustomiser customerGlobalHeaderOpenApiCustomiser() {log.info("[系统启动][SwaggerUI]initBean: customerGlobalHeaderOpenApiCustomiser");return new OpenApiCustomiser(){@Overridepublic void customise(OpenAPI openApi) {Paths paths = openApi.getPaths();//log.info("[系统启动][SwaggerUI]paths="+paths.toString());Collection<PathItem> values = paths.values();for (PathItem pathItem : values) {List<Operation> operations = pathItem.readOperations();//for (Operation operation : operations) {HeaderParameter headerParameter = new HeaderParameter();//headerParameter.setRequired(true);headerParameter.setName("token");operation.addParametersItem(headerParameter);}}}};}@Beanpublic GroupedOpenApi adminApi(OpenApiCustomiser customerGlobalHeaderOpenApiCustomiser) {//log.info("[系统启动][SwaggerUI]initBean: adminApi");return GroupedOpenApi.builder().group("1-前端接口").pathsToMatch("/api/**").addOpenApiCustomiser(customerGlobalHeaderOpenApiCustomiser).build();}
}
同时需要把对应的 group-configs 配置注释掉:
group-configs:
# - group: '1-前端接口'
# paths-to-match: /api/**- group: '2-系统内部接口'paths-to-match: /inter/**
其他思考
HeaderParameter 实际上是定制了 Parameter;
public class HeaderParameter extends Parameter {private String in = "header";// ...
}
本文中的案例, 因为是已经有了 yml 配置文件, 只想最小化改动, 所以配置了一部分 Bean。
按照这个思路, 增加全局统一的其他参数也可以类似实现。 可以加更多 Header, 可以按分组来配置, 也可以加其他参数。
更多文档
- OpenAPI Specification
- OpenAPI Guide
原文链接: https://github.com/cncounter/translation/
原文作者: 铁锚
原文日期: 2023年05月06日
SwaggerUI增加公共的Global全局Header相关推荐
- 组件库实战 | 用vue3+ts实现全局Header和列表数据渲染ColumnList
用vue3+ts实现全局Header和列表数据渲染ColumnList
- 解决yarn global全局安装的软件或依赖命令不生效
第六篇博客 解决yarn global全局安装的软件或依赖命令不生效 Created by @一个前端er 2020/05/05 前端菜鸟一枚,欢迎各位大佬对本博文批评指正 其实在我刚接触yarn不久 ...
- global全局对象
和window差不多,在浏览器里运行的时候,一些全局的属性,f就挂到了window中,在node.js中,我们就可以把全局变量属性和方法就挂到global对象中,global 属性自带几个比较常用的属 ...
- zuul通过zuulFilter实现token的权限认证和增加公共参数
整理思路: 1.用户登录或者注册后返回token给前台,并同时以userId为key,token为value存入redis 2.通过实现zuulFilter接口拦截所有通过的路由接口(单独放行登录和注 ...
- 前端学习(2750):global全局外观设置
- 前端学习(2346):global全局样式布局
- matlab类中增加公共属性,在面向对象的MATLAB中,属性如何工作?
使用香草类 使用香草类时,您需要告诉Matlab存储对象的修改副本以保存属性值中的更改.所以, >> a=testprop >> a.Request(5); % will NO ...
- 【编译原理笔记19】代码优化: 支配结点和回边,自然循环及其识别,删除全局公共子表达式和复制语句,代码移动,作用于归纳变量的强度削弱,归纳变量的删除
本次笔记内容: 8-10 支配结点和回边 8-11 自然循环及其识别 8-12 删除全局工工资表达式和赋值语句 8-13 代码移动 8-14 作用于归纳变量的强度削弱 8-15 归纳变量的删除 本节课 ...
- flutter网络dio框架公共请求参数、请求header使用总结
题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精. [x1]点击查看提示 [x2]各种系列的教程 一个程序员的修炼日记 本文章将讲述 1.get请求中配置公共参数 2.post请求配置公 ...
最新文章
- 乐观锁和悲观锁的区别(最全面的分析)
- 没学过python、但是还是有公司要-想转行,是要入坑Python还是Java?这问题还用问?...
- oracle更新统计信息执行计划,为准确生成执行计划更新统计信息-analyze与dbms_stats...
- PHP线程安全和非线程安全的区别
- 【NLP】国内实力雄厚的自然语言处理(NLP)研究组
- tomcat catalina localhost 没有项目_实用shell脚本--一键配置tomcat定期日志清理功能
- 用jQuery插件实现“小图点击预览大图”功能1
- 【对话】对话系统经典:检索式对话
- 如何利用MongoDB打造TOP榜小程序
- raid5加热备盘_Raid5、热备盘原理 | 与其焦虑
- (˙﹏˙) 开工~~~~~~
- Notification通知全文 7.0 and 8.0通知 ,横幅 ,显示,抖动,响铃
- OpenCV 视频人数统计研究
- rj45插座尺寸图_RJ45网络插座的基本知识
- warning: LF will be replaced by CRLF in ** 的原因及解决办法
- linux 开启审计服务,Linux审计服务Auditd systemctl重启问题解决
- 概率统计·概率论的基本概念【样本空间、随机事件、频率与概率】
- 华为30岁了,73岁的任正非管理哲学是怎样迭代的
- TCP三次握手以及UDP相关知识
- asynctask java_AsyncTask
热门文章
- 飞书机器人小助手@特定人
- C++:STL教程从入门到精通
- 修改Adobe Reader背景色
- Corechips SL2.2S USB2.0 4口 Hub 集成电路
- 网易蓝牙耳机怎么切换双耳_单双切换,自动秒连,真正的无感操作——360无线蓝牙耳机测评...
- 软件测试具有哪些优势
- 学习Masonry框架 - iOS
- Win10 解决电脑重启后 需重新设置双网卡共享问题
- jconsole连接远程服务
- perl mysql 数据推拉_Perl Mysql数据库操作实现代码