SpringDoc2问题汇总

news2024/12/23 17:30:28

在项目中尝试使用SpringDoc进行文档生成,在使用过程中遇到一系列的问题加以记录.

1.引入依赖

只是单纯的使用SpringDoc的话不需要引入一些乱七八糟的依赖,如今各种增强和拓展依赖层出不穷,但是随着这些依赖的出现带来的不仅是增强,还有各种效率问题。我认为这个还是需要根据个人和项目的需求去进行引入.

        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
            <version>2.6.0</version>
        </dependency>

 这个依赖包里包含了SpringDoc和Swagger,可以开箱即用之前用springdoc-openapi-ui,用起来感觉非常难受。

2.Security结合SpringDoc问题

需要SpringSecurity放行部分路径,这里只提供我的参考路径,另外Security方行的问题我会另起一篇来讲.

如果还需要在Swagger中进行调试,需要对OpeanAPI进行一些配置

    @Bean
    public OpenAPI costomOpenAPI() {
        OpenAPI openApi = new OpenAPI().addSecurityItem(new SecurityRequirement().addList("bearerAuth")).components(
                new Components()
                        .addSecuritySchemes(
               //这个是自定义的验证名称,用于在对应方法上注解表示使用Security授权调试
                                "bearerAuth", 
                                new SecurityScheme()
                    
                                        //验证请求方式
                                        .type(SecurityScheme.Type.HTTP)
                                        
                                        //验证数据格式
                                        .bearerFormat("JWT")
                                        .in(SecurityScheme.In.HEADER)
                                        
                                        //请求头key
                                        .name("Access-Token")
                                        
                                        //权限验证方式
                                        .scheme("bearer")
                        )
        ).info(costomInfo());

        return openApi;
    }

 在代码中的使用:

    @PostMapping("/register")
    @RequestLimit(coolTime = 60, maxCount = 5)
    @Operation(summary = "用户注册(1)", security = @SecurityRequirement(name = "bearerAuth"), description = "用户注册邮箱和密码", requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = @Content(mediaType = "application/json")))
    public ResultVO<Boolean> userRegister(
            @RequestBody @Valid UserFirstRegisterVO userFirstRegisterVO) {
        return userService.userRegister(userFirstRegisterVO);
    }

3.@RestControllerAdvice拦截SpringDoc返回数据

当使用响应结果处理器时,SpringDoc数据也会被拦截,最好就是将其数据排除在外,也避免对其他包装逻辑的入侵.

@RestControllerAdvice(basePackageClasses = {SpringDocConfig.class})
@RestControllerAdvice(basePackages = {"org.springdoc.**"})

4.使用自定义顺序的MessageConverter时,返回数据为Base64字符串.

当我调用 /v3/api-docs接口时,Swagger显示如下:

这段话一开始令我费解,因为依赖包中的版本都是对应的,通过各种问题查询我意识到这应该是Swagger未接收到返回数据,无法展示API界面,后来看到一篇解决文章,然后自己去调试解决了问题,问题文章在此,有兴趣的可以看下 问题文章。

这个问题挺有意思的,我来进行更详细的分析和解决方案.

原因就是调换了MVC原始的报文解析顺序,导致SpringDoc返回的byte[]被Jackson2报文解析器将其解析成了Base64,然后swagger无法解析。 

其实知道了问题后,解决的办法有很多很多,我去Git看了原作者给出的解决方案,已经过时了.

1.重写OpenApiResource

其要求继承OpenApiResource,然后将其解析成json格式返回,但是现在返回需为byte[],并且我尝试重写后并没有配置到SpringDoc中,而作者说会自动生效,后续再看看什么情况,或许可以考虑切面对返回值进行转换.

2.添加或调换MessageConverter顺序

出现此问题最根本的原因就是因为调换了MVC中最原始的报文解析顺序,原来应该排在最前的ByteArrayHttpMessageConverter被我放到Jekson2后面去了,但是我不希望因为SpringDoc一个问题而去修改我原来对其他请求的解析顺序,所以重新创建了一个继承ByteArray报文解析器,只需对support进行定义就好,这样就只会对/v3/api-docs返回的byte[]数据进行解析.

public class SpringDocHttpMessageConverter extends ByteArrayHttpMessageConverter {

    /**
     * 只转换SpringDoc返回的byte[]数据
     * @param clazz 其clazz是一个java.util.Collections$SynchronizedSortedMap,无法进行类型比较
     * @return true /false
     */
    @Override
    public boolean supports(Class<?> clazz) {
        return byte[].class == clazz && clazz.getName().equals("[B");
    }
}

这里Class对象只能去跟byte数组类型进行比较,因为/swagger-config接口去调用时也是通过SpringDoc返回的,但是却返回的是json数据,所以只能通过name去判断是否是/v3/api-docs获取的API数据.

然后将其放在Jekson2前面

        //将json转换器排到最前面
        converters.add(0, first);
        converters.add(0, new SpringDocHttpMessageConverter());

 后续有更好或者更优雅的办法再考虑考虑。

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

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

相关文章

【BUG】已解决:ModuleNotFoundError: No module named ‘PIL‘

已解决&#xff1a;ModuleNotFoundError: No module named ‘PIL‘ 目录 已解决&#xff1a;ModuleNotFoundError: No module named ‘PIL‘ 【常见模块错误】 错误原因&#xff1a; 解决办法&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我…

【性能优化】在大批量数据下使用 HTML+CSS实现走马灯,防止页面卡顿

切换效果 页面结构变化 1.需求背景 项目首页存有一个小的轮播模块,保密原因大概只能这么展示,左侧图片右侧文字,后端一次性返回几百条数据(开发环境下,生产环境只会更多).无法使用分页解决,前端需要懒加载防止页面卡顿 写个小demo演示,如下 2.解决思路 获取到数据后,取第一…

Air780E/Air780EP/Air780EQ/Air201模块遇到死机问题如何分析

Air780E/Air780EP/Air780EQ/Air201模块遇到死机问题如何分析 简介 本文档适用于合宙Air780E、Air780EP、Air780EQ、Air201 关联文档和使用工具&#xff1a; 从Ramdump里分析内存泄漏问题 无法抓底层log的情况下如何导出死机dump Luatools下载调试工具 EPAT抓取底层日志 F…

品牌媒体邀约的流程及注意事项

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 品牌媒体邀约是一个复杂但重要的公关策略&#xff0c;能够帮助企业提高曝光率、树立品牌形象并传递信息。以下是品牌媒体邀约的流程及注意事项&#xff1a; 一、品牌媒体邀约流程 明确目…

Xcode如何创建多个工程

在Xcode中创建如何创建下图所示的工程呢&#xff1f;即在工程下有四个子项目&#xff0c;且四个子项目不同时运行&#xff0c;每次只运行一个。使用Visual Studio C的话不过是基操而已&#xff01; 1.首先创建工程&#xff0c;即图中的“Project” 1.1 打开Xcode&#xff0c…

像 MvvmLight 一样使用 CommunityToolkit.Mvvm 工具包

文章目录 简介一、安装工具包二、实现步骤1.按照MvvmLight 的结构创建对应文件夹和文件2.编辑 ViewModelLocator3.引用全局资源二、使用详情1.属性2.命令3. 消息通知4. 完整程序代码展示运行结果简介 CommunityToolkit.Mvvm 包(又名 MVVM 工具包,以前称为 Microsoft.Toolkit…

使用Python爬虫下载视频源码

一、引言(●ˇ∀ˇ●) 在当今互联网时代&#xff0c;视频内容已成为人们获取信息和娱乐的重要方式。有时&#xff0c;我们可能希望将这些视频下载到本地&#xff0c;以便在没有网络的情况下观看。本文将介绍如何使用Python编写一个简单的爬虫。 二、环境准备&#x1f618; 在…

ThinkPad改安装Windows7系统的操作步骤

ThinkPad&#xff1a;改安装Windows7系统的操作步骤 一、BIOS设置 1、先重新启动计算机&#xff0c;并按下笔记本键盘上“F1”键进入笔记本的BIOS设置界面。 2、进入BIOS设置界面后&#xff0c;按下键盘上“→”键将菜单移动至“Restart“项目&#xff0c;按下键盘上“↓”按键…

pdf转换器哪个好?PDF转word工具分享

pdf转换器哪个好&#xff1f;选择PDF转换器可以极大地提升我们的工作效率与灵活性。它不仅能够轻松实现PDF文件与其他格式&#xff08;如Word、Excel、图片等&#xff09;之间的互转&#xff0c;满足多样化的文件处理需求&#xff1b;还能在保持文件内容完整性的同时&#xff0…

“信息科技风险管理”和“IT审计智能辅助”两个大模块的部分功能详细介绍:

数字风险赋能中心简介 数字风险赋能中心简介 &#xff0c;时长05:13 大家好&#xff01;我是AI主播安欣&#xff0c;我给大家介绍一下数字风险赋能中心。 大家都知道当前我国政企机构的数字化转型已经进入深水区&#xff0c;数字化转型在给我们带来大量创新红利的同时&#xf…

ForCloud全栈安全体验,一站式云安全托管试用 开启全能高效攻防

对于正处于业务快速发展阶段的企业&#xff0c;特别是大型央国企而言&#xff0c;日常的安全部署和运营管理往往横跨多家子公司&#xff0c;所面临的挑战不言而喻。尤其是在面对当前常态化的大型攻防演练任务时&#xff0c;难度更是呈“几何级数”上升&#xff1a; 合规难 众…

C++容器之vector

C vector容器 vector是可变数组。 容纳元素个数可以在运行期间变化。 std::vector 是 C 标准库中的动态数组容器&#xff0c;它提供了可变大小的数组功能&#xff0c;具有灵活性和多种强大的功能。 特点 动态大小: std::vector 可以根据需要动态增长或缩小&#xff0c;可以在…

使用VuePress-Reco快速搭建博客(保姆级)

简介&#xff1a;VuePress-Reco 一款简洁的 vuepress 博客 & 文档 主题&#xff0c;可以自由搭建自己的风格&#xff0c;比较方便简洁。 链接&#xff1a;vuepress-reco 准备环境&#xff1a; Node.Js >20.5.0&#xff0c;Npm > 10.8.2 OR Yarn > 1.22.19 注&am…

数据库系统概论:数据库系统的锁机制

引言 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;数据作为一种共享资源&#xff0c;其并发访问的一致性和有效性是数据库必须解决的问题。锁机制通过对数据库中的数据对象&#xff08;如表、行等&#xff09;进行加锁&#xff0c;以确保在同…

数据结构-冒泡排序

1 概念 冒泡排序属于一种常见的交换排序&#xff0c;根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置。具体操作是按顺序&#xff08;从前往后或从后往前&#xff09;两两对比元素直至本次排序结束&#xff0c;每次排序确认一个固定值&#xff08;末位或首…

windows USB 设备驱动开发-开发Type C接口的驱动程序(二)

编写 USB Type C 连接器驱动程序 在以下情况下&#xff0c;需要编写 USB Type-C 连接器驱动程序&#xff1a; 如果 USB Type-C 硬件能够处理电源输送 (PD) 状态机。 否则&#xff0c;请考虑编写 USB Type C 端口控制器驱动程序&#xff1b; 如果硬件没有嵌入式控制器。 否则&…

微信小程序 button样式设置为图片的方法

微信小程序 button样式设置为图片的方法 background-image background-size与background-repeat与border:none;是button必须的 <view style" position: relative;"><button class"customer-service-btn" style"background-image: url(./st…

[数据集][目标检测]拐杖检测数据集VOC+YOLO格式638张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;638 标注数量(xml文件个数)&#xff1a;638 标注数量(txt文件个数)&#xff1a;638 标注类别…

四个节点即可实现的ComfyUI批量抠图工作流

原文链接&#xff1a;ComfyUI面部修复完全指南 (chinaz.com) 下图就是批量抠图的工作流 虽然工作流很简单&#xff0c;但是我们前提还是需要安装好我们的节点 首先安装我们的抠图节点 安装 BiRefNet 所需依赖&#xff1a;timm&#xff0c;如已安装无需运行 requirements.txt…

【论文阅读】Mamba: Linear-Time Sequence Modeling with Selective State Spaces

Mamba: Linear-Time Sequence Modeling with Selective State Spaces 论文&#xff1a;[2312.00752] Mamba: Linear-Time Sequence Modeling with Selective State Spaces 作者&#xff1a;Albert Gu 和 Tri Dao&#xff0c;分别来自卡内基梅隆大学机器学习系和普林斯顿大学计…