从SpringFox向SpringDoc转移(OpenAPI2向OpenAPI3转移)

转移原因

在学习使用spring集成swagger3时查阅文档发现
SpringFox未支持 OpenAPI3 标准,而是还在支持2017年就已经停止维护的OpenAPI2了
而搜遍全网写OpenAPI3的教程少的可怜
但还是找到了与之相关的文章
文章跳转
但没有关于权限验证的相关教程,答案还得去官网找
官网链接

转移步骤

  • 删除springfox和swagger 2依赖项。而是添加springdoc-openapi-ui依赖

在这里插入图片描述

  • 2.替换注解

在这里插入图片描述

  • 3.替换Docket

在这里插入图片描述

  • 添加OpenAPI类型的bean
    在这里插入图片描述
    前四步都是官网上代码的,没有什么难度,所以不贴代码
    上面的配置可以直接写在启动类里面
    也可以创建一个配置类专门写关于swagger的配置
    这里我用第二种
    在这里插入图片描述
    配置完这四步后

  • 还需要在application.yml配置文件里做一些关于springDoc的配置

在这里插入图片描述

springdoc:
  swagger-ui:
    path: /swagger-ui.html  #swagger-ui访问路径 http://ip:端口/swagger-ui.html 默认就是swagger-ui.html
    csrf:
      enabled: true # 启用CSRF支持
  packages-to-scan: com.xiaohong.user.controller #包扫描路径

启动服务,访问网址

http://localhost:18081/swagger-ui.html (按自己的配置写)

界面大概就这样
在这里插入图片描述
如果访问后台接口不需要权限认证
那到这里就可以了
如果需要权限认证
那继续往后配

添加权限认证

我这里的后台接口访问都需要携带token请求头才允许访问
所以我选择使用一个全局安全认证
在官方文档里有这样一段相关的描述
在这里插入图片描述
试着把之前定义的OpenAPI修改

@Bean
    public OpenAPI springShopOpenAPI() {
        return new OpenAPI()
                .components(new Components()
                        .addSecuritySchemes("basicScheme", new SecurityScheme()
                                .type(SecurityScheme.Type.HTTP).scheme("basic")))
                .info(new Info().title("用户微服务")
                        .description("用户微服务接口文档")
                        .version("v0.0.1")
                        .license(new License().name("name").url("http://www.baidu.com")))
                .externalDocs(new ExternalDocumentation()
                        .description("SpringShop Wiki Documentation")
                        .url("https://springshop.wiki.github.org/docs"));
    }

重启服务
可以发现多了一个Authorize按钮
在这里插入图片描述
点开发现需要输入用户名和密码
在这里插入图片描述
这不是我想要的认证方式
我想要的是输入一段token
然后每次请求都把这段token 放到请求头中访问后台资源
那如何在请求头里添加参数呢?再次查看官方文档
在这里插入图片描述

找到相关的回答
点开链接看看
链接
在这里插入图片描述
可以看到这里有多种认证模式
刚刚使用的只是其中的HTTP模式
而根据文档
适合我的是API keys模式
那什么是API keys模式呢?点进去看一下
在这里插入图片描述
可以看到这种认证模式可以将token数据在请求时放到请求参数/请求头/cookie中
那怎么配置呢?继续往下看
在这里插入图片描述
这里给了一段示例代码
这不是Java格式,应该是json格式
仔细看还是能发现和之前的Java代码有关系的
在这里插入图片描述
可以看出这里应该是能够对应上的
好在我又找到了一条文章链接介绍了相关字段的意义
添加链接描述
在这里插入图片描述
那接下来就能够配置了

  @Bean
    public OpenAPI springShopOpenAPI() {
        return new OpenAPI()
                .components(new Components().addSecuritySchemes("Authorization", // key值
                        new SecurityScheme()
                                .type(SecurityScheme.Type.APIKEY) //请求认证类型
                                .name("Authorization") //API key参数名
                                .description("token令牌") //API key描述
                                .in(SecurityScheme.In.HEADER))) //设置API key的存放位置
                .info(new Info().title("用户微服务")
                        .description("用户微服务接口文档")
                        .version("v0.0.1")
                        .license(new License().name("name").url("http://www.baidu.com")))
                .externalDocs(new ExternalDocumentation()
                        .description("SpringShop Wiki Documentation")
                        .url("https://springshop.wiki.github.org/docs"));
    }

重启试试
在这里插入图片描述
感觉没问题
随便输入一个value试试,看看发送的请求里是否携带了请求头
在这里插入图片描述
没找到期待的请求头
那。。。继续看文档
发现我忽略了一小段配置
在这里插入图片描述
文档页写明了
在这里插入图片描述
仅配置securitySchemes是不够的,还需要使用security才能生效!!
那就添加一个security试试
在这里插入图片描述
发现需要一个参数
在这里插入图片描述
看源码
在这里插入图片描述
直接new一个试试
在这里插入图片描述
发现是接口。。
那就自己创一个!!
在这里插入图片描述
看不懂就全靠猜!!
再把list加进去
在这里插入图片描述
重启试试
在这里插入图片描述
在这里插入图片描述

幸福来得太突然哈哈哈
附上完整OpenAPI

  @Bean
    public OpenAPI springShopOpenAPI() {
        SecurityRequirement securityRequirement = new SecurityRequirement().addList("Authorization"); // 名字和创建的SecuritySchemes一致
        List<SecurityRequirement> list = new ArrayList<>();
        list.add(securityRequirement);
        return new OpenAPI()
                .components(new Components().addSecuritySchemes("Authorization", // key值
                        new SecurityScheme()
                                .type(SecurityScheme.Type.APIKEY) //请求认证类型
                                .name("Authorization") //API key参数名
                                .description("token令牌") //API key描述
                                .in(SecurityScheme.In.HEADER))) //设置API key的存放位置
                .security(list)
                .info(new Info().title("用户微服务")
                        .description("用户微服务接口文档")
                        .version("v0.0.1")
                        .license(new License().name("name").url("http://www.baidu.com")))
                .externalDocs(new ExternalDocumentation()
                        .description("SpringShop Wiki Documentation")
                        .url("https://springshop.wiki.github.org/docs"));
    }

修正

这里请求头里没有传入数据是因为在api上少量一个配置
在这里插入图片描述
这里的name就是这里的key值
在这里插入图片描述
每个接口上的name值可以不一样,只要在配置文件里配置了即可
更全内容看
这里

### Swagger3springdoc-openapi的关系 Swagger3指的是基于OpenAPI 3.x规范构建的一系列工具和服务。而`springdoc-openapi`则是将这些工具集成到Spring Boot应用程序中的库之一,它遵循最新的OpenAPI 3.x标准来描述RESTful Web服务接口[^1]。 ### 区别 - **版本支持**:`Springfox`主要针对的是Swagger 2.x规范;相反,`springdoc-openapi`专注于实现OpenAPI 3.x的新特性和支持更现代的功能集。 - **开发方式**:`Springfox`通过自定义配置类和Docket实例化的方式来进行设置,相对较为复杂;相比之下,`springdoc-openapi`利用了Spring框架本身的组件扫描机制自动识别控制器方法上的注解,并且可以直接使用原生的Spring MVC注解完成大部分工作,简化了开发者的工作量。 - **性能表现**:由于`springdoc-openapi`的设计更加贴近于Spring生态系统的内部运作原理,在某些情况下可能会提供更好的启动时间和运行效率。 ### 集成步骤 为了在Spring Boot项目中引入并启用`springdoc-openapi`以生成符合OpenAPI 3.x规格文档的服务端点: #### 添加依赖项 对于Maven工程而言,可以在项目的pom.xml文件内加入如下片段: ```xml <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-ui</artifactId> <version>${springdoc.version}</version><!-- 使用适当版本 --> </dependency> ``` 而对于Gradle,则应编辑build.gradle: ```groovy implementation &#39;org.springdoc:springdoc-openapi-ui:${springdocVersion}&#39; ``` 这里`${springdoc.version}`或`${springdocVersion}`代表具体的版本号,请依据实际需求选择稳定版次[^2]。 #### 应用属性调整 可以通过修改application.properties或者application.yml来自定义行为模式,比如指定基础包路径、分组策略等参数。例如: ```properties # application.properties springdoc.api-docs.path=/v3/api-docs springdoc.swagger-ui.path=/swagger-ui.html ``` 上述配置指定了访问API文档的具体URL地址以及UI界面的位置。 #### 自动发现资源 一旦完成了以上两步操作之后,默认情况下无需额外编码即可让`springdoc-openapi`接管整个过程——即自动探测所有的@RequestMapping标记的方法并将它们转换成为结构化的JSON/YAML格式输出给客户端查看[^3]。 ### 实际案例说明 当一切准备就绪后,只需正常编写带有@RestController或其他相似作用域声明的Java类成员函数作为HTTP请求处理器,随后就能立即享受到由该插件所提供的强大功能所带来的便利之处了。例如创建一个新的Controller类: ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/example") public class ExampleController { @GetMapping("/hello") public String sayHello() { return "Hello, world!"; } } ``` 此时如果浏览器打开http://localhost:8080/v3/api-docs将会看到对应于此controller的相关元数据信息被序列化后的样子;同理地前往http://localhost:8080/swagger-ui.html则会进入图形化的交互界面上进行探索测试。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值