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相关推荐

  1. 组件库实战 | 用vue3+ts实现全局Header和列表数据渲染ColumnList

    用vue3+ts实现全局Header和列表数据渲染ColumnList

  2. 解决yarn global全局安装的软件或依赖命令不生效

    第六篇博客 解决yarn global全局安装的软件或依赖命令不生效 Created by @一个前端er 2020/05/05 前端菜鸟一枚,欢迎各位大佬对本博文批评指正 其实在我刚接触yarn不久 ...

  3. global全局对象

    和window差不多,在浏览器里运行的时候,一些全局的属性,f就挂到了window中,在node.js中,我们就可以把全局变量属性和方法就挂到global对象中,global 属性自带几个比较常用的属 ...

  4. zuul通过zuulFilter实现token的权限认证和增加公共参数

    整理思路: 1.用户登录或者注册后返回token给前台,并同时以userId为key,token为value存入redis 2.通过实现zuulFilter接口拦截所有通过的路由接口(单独放行登录和注 ...

  5. 前端学习(2750):global全局外观设置

  6. 前端学习(2346):global全局样式布局

  7. matlab类中增加公共属性,在面向对象的MATLAB中,属性如何工作?

    使用香草类 使用香草类时,您需要告诉Matlab存储对象的修改副本以保存属性值中的更改.所以, >> a=testprop >> a.Request(5); % will NO ...

  8. 【编译原理笔记19】代码优化: 支配结点和回边,自然循环及其识别,删除全局公共子表达式和复制语句,代码移动,作用于归纳变量的强度削弱,归纳变量的删除

    本次笔记内容: 8-10 支配结点和回边 8-11 自然循环及其识别 8-12 删除全局工工资表达式和赋值语句 8-13 代码移动 8-14 作用于归纳变量的强度削弱 8-15 归纳变量的删除 本节课 ...

  9. flutter网络dio框架公共请求参数、请求header使用总结

    题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精. [x1]点击查看提示 [x2]各种系列的教程 一个程序员的修炼日记 本文章将讲述 1.get请求中配置公共参数 2.post请求配置公 ...

最新文章

  1. 乐观锁和悲观锁的区别(最全面的分析)
  2. 没学过python、但是还是有公司要-想转行,是要入坑Python还是Java?这问题还用问?...
  3. oracle更新统计信息执行计划,为准确生成执行计划更新统计信息-analyze与dbms_stats...
  4. PHP线程安全和非线程安全的区别
  5. 【NLP】国内实力雄厚的自然语言处理(NLP)研究组
  6. tomcat catalina localhost 没有项目_实用shell脚本--一键配置tomcat定期日志清理功能
  7. 用jQuery插件实现“小图点击预览大图”功能1
  8. 【对话】对话系统经典:检索式对话
  9. 如何利用MongoDB打造TOP榜小程序
  10. raid5加热备盘_Raid5、热备盘原理 | 与其焦虑
  11. (˙﹏˙) 开工~~~~~~
  12. Notification通知全文 7.0 and 8.0通知 ,横幅 ,显示,抖动,响铃
  13. OpenCV 视频人数统计研究
  14. rj45插座尺寸图_RJ45网络插座的基本知识
  15. warning: LF will be replaced by CRLF in ** 的原因及解决办法
  16. linux 开启审计服务,Linux审计服务Auditd systemctl重启问题解决
  17. 概率统计·概率论的基本概念【样本空间、随机事件、频率与概率】
  18. 华为30岁了,73岁的任正非管理哲学是怎样迭代的
  19. TCP三次握手以及UDP相关知识
  20. asynctask java_AsyncTask

热门文章

  1. 飞书机器人小助手@特定人
  2. C++:STL教程从入门到精通
  3. 修改Adobe Reader背景色
  4. Corechips SL2.2S USB2.0 4口 Hub 集成电路
  5. 网易蓝牙耳机怎么切换双耳_单双切换,自动秒连,真正的无感操作——360无线蓝牙耳机测评...
  6. 软件测试具有哪些优势
  7. 学习Masonry框架 - iOS
  8. Win10 解决电脑重启后 需重新设置双网卡共享问题
  9. jconsole连接远程服务
  10. perl mysql 数据推拉_Perl Mysql数据库操作实现代码