首页 > 其他分享 >【Swagger】Swagger入门和一些常见的问题

【Swagger】Swagger入门和一些常见的问题

时间:2024-09-20 14:35:32浏览次数:11  
标签:Swagger return 入门 常见 接口 文档 swagger public

什么是Swagger

swagger(丝袜哥)是当下比较流行的实时接口文档生成工具。前后端分离后,前后端交流比较重要的东西,就是接口文档。离线文档,最大的弊端就是接口程序发生变动的时候,需要回过头来维护上面的内容,确实比较玛法。

实时接口文档可以根据代码来自动生成相应的接口文档。根据代码自动生成的文档,最大的弊端是代码入侵性强(但对比起实时维护接口的麻烦,这是小问题)。Swagger就是其中比较有影响力的实施接口文档。

注:接下来的环境和方法,指的是在Java的SpringBoot框架下,使用和配置Swagger.

配置步骤

swagger的官网地址为:https://swagger.io/ ,当然是英文版的,可以参考。Swagger分为Swagger2和Swagger3两个常用版本。用起来,主体的区别不是很大,现在以Swagger3为例。

1. 在xml下添加配置

Springboot2.6之前的版本(如果高于这个会有版本冲突,解决方案详见下文)

<!-- Swagger 3 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>

但是,如果引用Springdoc,注解与spirngfox不同 。引用如下:

  <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi</artifactId>
            <version>1.6.9</version>
        </dependency>

注释对照关系如下:

springfox springdoc
@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)
@ApiOperation(value = "foo", notes = "bar") 
@Operation(summary = "foo", description = "bar")
@ApiParam
@Parameter
@ApiResponse(code = 404, message = "foo")
@ApiResponse(responseCode = "404", description = "foo")

Swagger 配置类

/**
 * Swagger配置类
 * @Author:lyj
 * @Package:com.example.demo.demo.config
 * @Project:demo
 * @name:SwaggerConfig
 * @Date:2024/9/18 14:19
 * @Filename:SwaggerConfig
 */
@Configuration
@EnableOpenApi
public class SwaggerConfig {

    /**
     * 创建API
     * @return
     */
    @Bean
    public Docket createRestApi(){
        return new Docket(DocumentationType.OAS_30)
                // 是否启用Swagger
                .enable(true)
                // API的基本信息,展示在文档页面中(自定义展示信息)
                .apiInfo(apiInfo())
                // 设置哪些接口暴露给Swaager展示
                .select()
                // 扫码所有注解的api,用这种方式比较灵活
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                // 扫描指定包中的swagger注解
                //.apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger"))
                // 扫描所有 .apis(RequestHandlerSelectors.any())
                .build();
    }

    /**
     * 添加照耀信息
     * @return
     */
    private ApiInfo apiInfo() {
        return  new ApiInfoBuilder()
                // 标题
                .title("XXXX项目接口文档")
                // 说明信息
                .description("项目的说明信息")
                // 文档生成的主页地址
                .termsOfServiceUrl("文档生成的主页地址")
                // 作者信息
                .contact(new Contact("姓名","url","邮箱地址"))
                //版本
                .version("版本号:1.0")
                .build();

    }
}

如果启动成功,Swagger的访问地址:IP地址:端口号/swagger-ui/index.html (http://localhost:8081/swagger-ui/index.html)。

假设已有接口文档

@Data
@ApiModel("用户")
public class User {
    private Integer id;
    @ApiModelProperty("姓名")
    private  String name;
    @ApiModelProperty("地址")
    private  String addr;
}

 

@RestController
@RequestMapping("/user")
@Api(value = "用户接口",tags = {"用户接口"})
public class UserController {
    @ApiOperation("新增用户")
    @PostMapping("save")
    public String save(@RequestBody User user){
        return "success " + user.getName();
    }

    @ApiOperation("根据条件查询")
    @GetMapping("get/{id}")
    public User getById(@PathVariable("id") Integer id){
        User user = new User();
        user.setId(id);
        user.setName("zs");
        user.setAddr("地址:123456……");
        return  user;
    }
}

访问成功

 

 

 

SpringBoot和Swagger版本兼容问题

按照以上的方式,当我们启动项目是,可能会报错:“Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException”。

 异常原因是:因为SpringBoot和Swagger版本不兼容。

 最直接的方法,是将SpringBoot版本,修改到2.6.0以下。如果项目中的SpringBoot版本不能修改的话,我们还可以在application.yml配置文件中进行修改

spring:
  profiles:
    active: dev
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher

 修改UI

不过,依照我们的习惯,Swagger原生的样式不是特别好看(不是指样式,指的不太好看到接口)。

  • 缺乏搜索功能
  • 接口类多起来,找接口有如大海捞针。
  • 接口边上,没有带着接口注释
  • 看Model,需要拖拽到最后,没有很自然的切换。

所有又有一些大神,提供了其他的UI测试页面。这个页面的使用还是比较广泛的。添加引用 (具体引用,根据SpringBoot版本:https://doc.xiaominfo.com/docs/quick-start/start-knife4j-version

 <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
            <version>4.0.0</version>
        </dependency>

接口分组

假设对demo1和demo2两个包进行分组。

 

额外创建分组1和分组2,Swagger的包或路径过滤,请参考:https://www.cnblogs.com/luyj00436/p/18421728

 /**
     * 默认分组
     * @return
     */
    @Bean
    public Docket createRestApi(){
        return new Docket(DocumentationType.OAS_30)
                // API的基本信息,展示在文档页面中(自定义展示信息)
                .apiInfo(apiInfo())
                // 设置哪些接口暴露给Swaager展示
                .select()
                // 扫码所有注解的api,用这种方式比较灵活
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                // 扫描指定包中的swagger注解
                //.apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger"))
                // 扫描所有 .apis(RequestHandlerSelectors.any())
                .build();
    }
    /**
     * 分组1
     * @return
     */
    @Bean
    public Docket ApiDemo1(){
        return new Docket(DocumentationType.OAS_30)
                .groupName("分组1")
                // API的基本信息,展示在文档页面中(自定义展示信息)
                .apiInfo(apiInfo1())
                // 设置哪些接口暴露给Swaager展示
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.demo1"))
                .build();
    }
    /**
     * 分组2
     * @return
     */
    @Bean
    public Docket ApiDemo2(){
        return new Docket(DocumentationType.OAS_30)
                .groupName("分组2")
                // API的基本信息,展示在文档页面中(自定义展示信息)
                .apiInfo(apiInfo2())
                // 设置哪些接口暴露给Swaager展示
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.demo2"))
                .build();
    }

 

swaggerUI 拦截器和跨域冲突处理 

 如果我们的项目中有关于跨域的处理,同时还有拦截器,然后还要使用swagger,这种情况大家要注意了,有可能我们的拦截器会将swagger中的页面路径拦截掉导致swagger页面出不来,当我们在拦截器中把swagger的页面排除掉的时候,也有可能会导致跨域配置的失效。

第一步,定义拦截器

/**
 * 拦截器配置
 *
 */
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
 
    @Bean
    public TokenInterceptor tokenInterceptor() {
        return new TokenInterceptor();
    }
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry
                .addInterceptor(tokenInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/user/login")
                .excludePathPatterns("/user/downloadExcel")
                .excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**");
    }
 
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}

第2步:跨域配置

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
 
@Configuration
public class CorsConfig {
 
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("*");
        config.setAllowCredentials(true);
        config.addAllowedMethod("*");
        config.addAllowedHeader("*");
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);
        return new CorsFilter(configSource);
    }
}

参考地址

标签:Swagger,return,入门,常见,接口,文档,swagger,public
From: https://www.cnblogs.com/luyj00436/p/18418374

相关文章

  • WordPress中最佳播客插件:入门级指南
    近年来,播客在全球范围内迅速普及,成为人们获取信息和娱乐的重要途径。对于想在WordPress网站上添加播客功能的用户来说,选择合适的插件非常重要。本文将为大家介绍几款适合用户入门级WordPress播客插件,让你轻松实现播客功能。1.PodcastPlayer简介PodcastPlayer是一款简单易用的插......
  • Java Map和List常见操作
    Javamap详解-用法、遍历、排序、常用API等-Java初级码农-博客园(cnblogs.com)//创建实例importjava.util.*;publicclassListDemo{publicstaticvoidmain(String[]args){List<String>arrayList=newArrayList<>();//创建ArrayList实例......
  • 机器学习之Python中Scikit-Learn(sklearn)入门
    文章目录机器学习之Python中Scikit-Learn(sklearn)入门一、引言二、安装与导入1、安装2、导入库三、LinearRegression线性回归1、算法简介2、模型创建与训练2.1、创建模型2.2、数据准备2.3、划分数据集2.4、模型训练3、模型评估4、模型使用四、总结机器学习之Python......
  • SpringBoot入门
    什么是SpringBoot?SpringBoot是一个基于Spring框架的开源项目,旨在简化Spring应用程序的开发。它通过约定优于配置的方式,减少了配置文件的数量,并提供了许多默认设置,使得开发者能够快速构建生产级别的应用程序。1.环境准备1.1安装JDK首先,你需要安装Java开发工具......
  • 帝国CMS刷新失败,常见原因及解决方法有哪些?
    帝国CMS刷新失败可能由多种原因造成,以下是一些常见的原因及相应的解决方法:常见原因及解决方法服务器配置问题PHP版本过低:确保PHP版本至少为5.6或更高版本。缺少必需的PHP扩展:确保安装了必要的PHP扩展,如gd、mbstring、iconv等。内存限制不足:增加PHP的最大内存限制,通常建议......
  • 华为仓颉语言入门(1):仓颉概述
    解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界仓颉编程语言是一种专门为应用开发设计的通用语言。与现代编程语言类似,它以高效、稳定和功能强大为核心,确保安全且易于上手。仓颉不仅适用于各种应用场景,还展示了其在扩展性方面的广阔前景。仓颉的潜力巨大,非常值......
  • 使用 RecyclerView 时,有哪些常见的性能优化技巧可以分享?
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点使用RecyclerView时,性能优化是确保流畅用户体验的关键。以下是一些常见的性能优化技巧:1、减少布局复杂性:尽量简化列表项的布局,减少视图嵌套层次,可以使用Const......
  • pdf编辑器免费版哪个好用?8款pdf编辑软件推荐指南,从入门到精通!
    在现代数字化办公中,PDF格式以其稳定及兼容性成为了文档分享的首选。然而,处理PDF文件时,您是否曾感到困惑,不知如何进行编辑?无论是添加文本、替换图像,还是压缩文件,找到合适的工具都是关键。在本文中,我们整合了8款pdf编辑器免费版,这些pdf编辑软件能够帮助您快速添加文本、替换图像......
  • 【Java】【Swagger】——接口过滤
    在前后端分离时代,Swagger能够实时更新API,十分好用。那么如果根据实际业务需要,展示接口呢?前提已经成功使用Swagger。知道增加 @Bean注解增加分组。此时不同的分组就涉及到不同的过滤。如何过滤接口?增加注解@ApiIgnoreapis():指定包名paths:过滤url增加注解@ApiIgnor......
  • FLUENT离心风机仿真手把手零基础入门进阶有声解说教程(#331)
    本文摘要(由AI生成):本文主要介绍了FLUENT中旋转机械仿真方法,包括旋转坐标系模型、多参考坐标系模型、混和平面模型、滑移网格模型和重叠网格模型。其中,多重参考系法与滑移网格法设置几乎相同,两者相互转换容易。本文以离心风机为例,介绍了使用WORKBENCH19.2平台及其对应的DM、ICEM......