SpringBoot2.7集成Swagger3.0和knife4j实现API接口文档开发

news2024/11/15 23:20:16

1. 概述

Swagger 3 是一个用于描述、构建和测试 RESTful Web 服务的开源工具集。它提供了一种简单而强大的方式来定义和文档化 API 接口,同时还具备自动生成客户端代码和服务器存根代码的功能。
Knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案,其前身是swagger-bootstrap-ui。

2. 版本说明

组件版本
springfox3.0.0
knife4j3.0.3

Knife4j官网文档表明该版本为过度版本,已经很久没更新,最新版本支持Swagger2规范的springfox 2.10.5版本,在SpringBoot3中只支持OpenAPI3规范,鉴于国内使用Swagger比较广泛,本文以上面版本为例集成API接口文档,后续会以OpenAPI3规范为基础集成API接口文档。

3. 引入核心依赖

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>

4. 编写Swagger配置文件

@Configuration
@EnableOpenApi
public class SwaggerConfig {

    @Bean
    public Docket docket() {
        RequestParameterBuilder parameterBuilder = new RequestParameterBuilder();
        List<RequestParameter> parameters = new ArrayList<>();
        parameterBuilder.name("commerce-user")
                .description("token值")
                .in(ParameterType.HEADER)
                .required(true)
                .build();
        parameters.add(parameterBuilder.build());
        return new Docket(DocumentationType.OAS_30)
                .apiInfo(apiInfo())
                .enable(true)//开启Swagger文档
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.xlhj.commerce"))
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                .paths(PathSelectors.any())
                .build()
                .globalRequestParameters(parameters);
    }

    public ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("micro-service")
                .description("commerce-service")
                .contact(new Contact("xxxx.xxx", "www.xlhj.com.cn", "xxxx.xxxx@xlhj.com"))
                .version("1.0")
                .build();
    }
}

直接启动项目时会报如下的错误:Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is java.lang.NullPointerException
nullPointer异常
这是因为Springfox假设Spring MVC的路径匹配策略是 ant-path-matcher,而 Spring Boot 2.6以上版本的默认匹配策略是 path-pattern-matcher,需要加入一下配置

@Configuration
public class BeanPostProcessorConfig {

    @Bean
    public BeanPostProcessor beanPostProcessor() {
        return new BeanPostProcessor() {
            @Override
            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
                if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
                    handlerMappings(getHandlerMappings(bean));
                }
                return bean;
            }

            private <T extends RequestMappingInfoHandlerMapping> void handlerMappings(List<T> mappings) {
                List<T> copy = mappings.stream()
                        .filter(mapping -> mapping.getPatternParser() == null)
                        .collect(Collectors.toList());
                mappings.clear();
                mappings.addAll(copy);
            }

            private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
                try {
                    Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
                    field.setAccessible(true);
                    return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
                } catch (IllegalArgumentException | IllegalAccessException e) {
                    throw new IllegalStateException(e);
                }
            }
        };
    }
}

5. 静态文件过滤

如果项目中引入了权限认证,还需要将Swagger的静态文件路径放行,配置如下:

@Configuration
public class XlhjWebMvcConfig extends WebMvcConfigurationSupport {
    /**
     * MVC 加载Swagger静态资源
     * @param registry
     */
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")
                .addResourceLocations("classpath:/static/");
        registry.addResourceHandler("doc.html")
                        .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                        .addResourceLocations("classpath:/META-INF/resources/webjars/");
        registry.addResourceHandler("/swagger-ui/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/");
        super.addResourceHandlers(registry);
    }
}

6. 编写业务Controller

@Api(tags = "用户地址服务")
@Slf4j
@RestController
@RequestMapping("/address")
public class AddressController {

    private final IAddressService addressService;

    public AddressController(IAddressService addressService) {
        this.addressService = addressService;
    }

    @ApiOperation(value = "创建", notes = "创建用户地址信息", httpMethod = "POST")
    @PostMapping(value = "/create-address")
    public TableId createAddressInfo(@RequestBody AddressInfo addressInfo) {
        return addressService.createAddressInfo(addressInfo);
    }
}

7. Swagger常用注解

Swagger注解主要分为两大类,一类是用于Controller类,一类用于请求/响应实体类
用于Controller类的注解有:
@Api:描述API接口的基本信息,包括接口名称、描述
@ApiOperation:描述API接口的操作方法,包括HTTP请求方法、接口路径、接口说明
@ApiParam:描述API接口的参数信息,包括参数名称、参数类型、参数说明
用于请求/响应实体类的注解有:
@ApiModel:描述API接口的类信息,包括数据结构和说明
@ApiModelProperty:描述API接口字段属性,包括属性名称、属性类型、属性说明

8. 验证

启动项目,在浏览器访问地址http://127.0.0.1:8003/commerce-account-service/swagger-ui/index.html和http://127.0.0.1:8003/commerce-account-service/doc.html
swagger首页
knife4j首页
文档页

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

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

相关文章

DNSPod十问秦勇:为什么医疗AI最爱眼科?

本期嘉宾 秦勇 鹰瞳科技Airdoc COO 秦勇&#xff0c;鹰瞳科技&#xff08;Airdoc&#xff09;COO&#xff0c;中国人工智能学会智慧医疗专委会委员&#xff0c;长期从事医疗人工智能方向的工作&#xff0c;拥有丰厚的项目经验、管理经验和技术积累&#xff0c;参与多个医院人…

掌握Python的X篇_13+14_Python条件语句实例:判断闰年、成绩评定

前面学习了条件语句以及调试的基本技巧&#xff0c;本篇介绍两个与条件语句有关的实例&#xff0c;对前面的知识又深刻认识。 文章目录 1. 判断闰年1.1 版本11.2 版本21.3 一行代码太长的处理方法 2. 根据成绩评级 1. 判断闰年 用户输入年份&#xff0c;判断该年份是否为闰年…

基于springboot+jpa+mysql+html网上中药商城系统

基于springbootjpamysqlhtml网上中药商城系统 一、系统介绍二、功能展示1.主页(客户)2.登陆&#xff08;客户&#xff09;3.注册&#xff08;客户&#xff09;4.购物车(客户)5.我的订单&#xff08;客户&#xff09;6.用户管理&#xff08;管理员&#xff09;7.分类管理&#x…

基于鲸鱼优化算法的5G信道估计(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…

1400*D. Divide by three, multiply by two

题意&#xff1a; 一个序列&#xff0c;每个数都是前一个数乘2或者除3&#xff0c;打乱之后&#xff0c;需要你排出原来的序列。 queue和deque模拟 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N1e55; ll n,a[N]; queue<ll>q; d…

Python进行数据分析(详细教程)

1.为什么选择Python进行数据分析&#xff1f; Python是一门动态的、面向对象的脚本语言&#xff0c;同时也是一门简约&#xff0c;通俗易懂的编程语言。Python入门简单&#xff0c;代码可读性强&#xff0c;一段好的Python代码&#xff0c;阅读起来像是在读一篇外语文章。Pyth…

【Linux命令200例】locate强大的文件查找利器

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

2.uni-app项目文件

uni-app像是vue与微信小程序的合体&#xff0c;使用 uni-ui项目 模板创建的项目文件如下 目录 1 pages 2 pages.json 3 App.vue 4 index.html 5 static 6 uni_modules 7 manifest.json 8 main.js 9 uni.scss 1 pages 这个是放页面的&#xff0c;默认里面有…

list与sort()

运行代码&#xff1a; //list与sort() #include"std_lib_facilities.h" //声明Item类 struct Item {string name;int iid;double value;Item():name(" "),iid(0),value(0.0){}Item(string ss,int ii,double vv):name(ss),iid(ii),value(vv){}friend istre…

七、用户画像

目录 7.1 什么是用户画像7.2 标签系统7.2.1 标签分类方式7.2.2 多渠道获取标签 7.3 用户画像数据特征7.3.1 常见的数据形式7.3.2 文本挖掘算法7.3.3 嵌入式表示7.3.4 相似度计算方法 7.4 用户画像应用 因此只基于某个层面的数据便可以产生部分个体面像&#xff0c;可用于从特定…

pso优化bp网络机械故障诊断(MATLAB代码)

在混合算法中,需要优化的对象(粒子)是 BP 神经网络的权值和值。首先应把要优化的神经网络的全部权值和闽值构成一个实数数组,并赋予它们 [0,1之间的随机数。然后,按照选定的网络结构,用前向算法计算出对应于每组输入样本的神经网络输出。这里BP网络的激活函数都选为sigmoid 函数…

【unity细节】怎么让物体产生碰撞后不会被撞飞,但是有碰撞停止的效果

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;unity细节和bug ⭐怎么让物体产生碰撞后不会被撞飞&#xff0c;但是有碰撞停止的效果⭐ 文章目录…

PHP-Mysql图书管理系统--【白嫖项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 首页phpStudy 设置导数据库后台的管理界面数据库表结构项目目录如图&#xff1a;代码部分&#xff1a;主页的head 配套资源作业&#xff1a; 本系列校训 用免费公开视频&am…

Linux安装Kafka图形化界面

Apache Kafka本身是一个分布式的消息系统&#xff0c;它并没有官方提供的图形界面。Kafka主要通过命令行界面进行管理和操作。 如果你需要一个可视化的界面来管理Kafka&#xff0c;可以考虑安装一些第三方的Kafka管理工具&#xff0c;例如Kafdrop、Kafka Manager或Conduktor等…

NOAUTH Authentication required解决方法

执行redis报错如下&#xff1a; 提示需要进行权限认证 解决方案 输入redis密码 格式&#xff1a; auth 密码

vue使用Clodop插件打印

一、前往lodop官网&#xff0c;下载插件&#xff0c;http://www.lodop.net/index.html 这里下载的window64位的&#xff0c;将插件安装好&#xff0c;运行&#xff0c;会看到 点击‘去了解C-Lodop>>’,会跳转至使用说明页面&#xff0c;在这个页面里&#xff0c;可以打印…

Facebook开源PySlowFast视频理解代码库

近年来&#xff0c;Facebook 人工智能研究&#xff08;FAIR&#xff09;一直在为视频理解研究做出重大贡献。在2019年10月的ICCV上&#xff0c;该团队推出了一个基于Python的代码库PySlowFast。FAIR现在是开源的PySlowFast&#xff0c;还有一个预先训练的模型库&#xff0c;并承…

camunda流程引擎简单上手

快速开始 参考官方的文档&#xff1a; https://docs.camunda.org/get-started/ 我下面会在关键部署简单记录一下。 下载 服务端 https://docs.camunda.org/manual/latest/installation/full/tomcat/pre-packaged/ 为了方便我们直接下载tomcat整合包&#xff0c;不用自己在…

1200*C. K-th Not Divisible by n

Example input 6 3 7 4 12 2 1000000000 7 97 1000000000 1000000000 2 1 output 10 15 1999999999 113 1000000001 1 解析&#xff1a; 将每 n 个数看成一组&#xff0c;每组缺少了一个n的倍数&#xff0c;所以按照对 n-1 整除和取模分别得出组数和余数&#xff0c;乘起来…

Hexo+GithubPages免费搭建个人博客网站

HexoGithubPages免费搭建个人博客网站 目录 一、前言二、Github配置 新建同名仓库配置Pages 三、安装Hexo四、配置hexo-deployer-git五、访问六、发布文章七、安装主题 一、前言 我之前开了好几年的云服务器了&#xff0c;实际上使用场景并不是很多&#xff0c;感觉有点浪费…