SpringBoot教程(十七) | SpringBoot集成Swagger系列(版本2、版本3)

一、Swagger的简述

Swagger(现在更广泛地被称为OpenAPI)是一套基于OpenAPI规范构建的开源工具,它主要用于生成、描述、调用和可视化RESTful风格的Web服务。
其中最重要的表现在于实时接口文档,可以更好的让前端进行联调

二、SpringBoot集成swagger2

1. 引入依赖

首先,你需要在项目的pom.xml文件中添加Swagger2的依赖。

<dependencies>  
    <!-- Swagger2 -->  
    <dependency>  
        <groupId>io.springfox</groupId>  
        <artifactId>springfox-swagger2</artifactId>  
        <!-- 注意:这里使用的是2.9.2版本 用的人比较多 -->  
        <version>2.9.2</version> 
    </dependency>  
    <dependency>  
        <groupId>io.springfox</groupId>  
        <artifactId>springfox-swagger-ui</artifactId>  
        <!-- 与swagger2版本保持一致 -->  
        <version>2.9.2</version> 
    </dependency>  
</dependencies>

2. 新建SwaggerConfig配置类

@EnableSwagger2

@Configuration  
@EnableSwagger2  
public class SwaggerConfig {  
    @Bean  
    public Docket docket() {  
        return new Docket(DocumentationType.SWAGGER_2)  
                .select()  
                //通过包路径来指定哪些Controller中的API需要被Swagger扫描并生成文档。
                //这里指定了"com.yourcompany.yourproject.controller"包及其子包中的所有Controller。
                .apis(RequestHandlerSelectors.basePackage("com.yourcompany.yourproject.controller"))  
                //扫描所有路径  
                .paths(PathSelectors.any()) 
                .build()  
                 //设置API的元数据信息,如标题、描述、版本等。
                 //这些信息会显示在Swagger UI的顶部。   
                .apiInfo(apiInfo());
    }  
  
    private ApiInfo apiInfo() {  
        return new ApiInfoBuilder()  
                .title("你的项目名称")  
                .description("项目的API描述")  
                .version("1.0")  
                .build();  
    }  
}

如果你只想包含特定路径的API,可以使用其他PathSelectors方法,
如antPath(“/user/**”)来匹配所有以"/user/"开头的路径。

可以把 .paths(PathSelectors.any())  换成 .paths(PathSelectors.antPath("/user/**"))

当 SpringBoot为2.6.x及以上时 需要注意

由于SpringBoot 2.6.x及以上版本使用了新的路径匹配策略(PathPatternMatcher),
而Swagger(尤其是Springfox-swagger2)通常使用的是AntPathMatcher,
这可能会导致两者之间的不兼容问题。

在application.properties或application.yml文件中,
可以将SpringBoot的默认路径匹配策略更改为AntPathMatcher,以解决与Swagger的兼容性问题。
配置示例如下:

properties写法如下

spring.mvc.pathmatch.matching-strategy=ant_path_matcher

或者在application.yml中:

spring:  
  mvc:  
    pathmatch:  
      matching-strategy: ant_path_matcher

3.配置Swagger开关

可以在application.properties或application.yml文件中定义不同的环境配置,
然后在Swagger配置类中根据当前激活的Profile来决定是否启用Swagger。

application.yml示例

spring:  
  profiles: 
    #指定激活 
    active: dev  
  
--- 
#测试环境 
spring:  
  config:  
    activate:  
      on-profile: dev  
swagger:  
  enabled: true  
  
---  
#开发环境
spring:  
  config:  
    activate:  
      on-profile: prod  
swagger:  
  enabled: false
@Configuration  
@EnableSwagger2  
public class SwaggerConfig {  
  
    // 使用@Value注解读取配置文件中的swagger.enabled值  
    @Value("${swagger.enabled:false}")  
    private Boolean swaggerShow;  
  
    @Bean  
    public Docket docket() {  
        return new Docket(DocumentationType.SWAGGER_2)  
                .enable(swaggerShow)
                .select()  
                // 通过包路径来指定哪些Controller中的API需要被Swagger扫描并生成文档  
                .apis(RequestHandlerSelectors.basePackage("com.yourcompany.yourproject.controller"))  
                // 扫描所有路径  
                .paths(PathSelectors.any())  
                .build()  
                // 设置API的元数据信息  
                .apiInfo(apiInfo());   
    }  
  
    private ApiInfo apiInfo() {  
        return new ApiInfoBuilder()  
                .title("你的项目名称")  
                .description("项目的API描述")  
                .version("1.0")  
                .build();  
    }  
}

4. 在你的Controller上添加swagger注解

import com.mcy.springbootswagger.User.User;
import com.mcy.springbootswagger.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user")
//说明接口文件
@Api(value = "测试接口", tags = "用户管理相关的接口", description = "用户测试接口")
public class UserController {
    @Autowired
    private UserService userService;

    /**
     * 保存数据
     * @param user
     * @return
     */
    @PostMapping(value = "/save")
    //方法参数说明,name参数名;value参数说明,备注;dataType参数类型;required 是否必传;defaultValue 默认值
    @ApiImplicitParam(name = "user", value = "新增用户数据")
    //说明是什么方法(可以理解为方法注释)
    @ApiOperation(value = "添加用户", notes = "添加用户")
    public String saveUser(User user){
        userService.save(user);
        return "保存成功";
    }

    /**
     * 根据id查询用户
     * @param id
     * @return
     */
    @GetMapping(value = "findById")
    @ApiOperation(value = "根据id获取用户信息", notes = "根据id查询用户信息")
    public User getUser(Integer id){
        return userService.findById(id);
    }

    @DeleteMapping(value = "deleteById")
    @ApiOperation(value = "根据id删除数据", notes = "删除用户")
    public String delete(Integer id){
        userService.deleteById(id);
        return "删除成功";
    }
}

5. 启动应用,访问 ip:端口/swagger-ui.html (默认皮的情况下)

运行项目,输入http://localhost:8080/swagger-ui.html 访问Swagger页面,页面如下:

由于我们只给用户接口添加了注解,所有用户接口是可以直接观察中文文档的。

在这里插入图片描述
在这里插入图片描述

  • 点击需要测试的接口方法后,
    可以看到接口需要的参数,请求地址及接口说明信息。
    点击右上角的Try it out即可对接口进行测试。
    在这里插入图片描述
    在这里插入图片描述
  • 查询结果:
    在这里插入图片描述
    这里这些了部分接口进行测试,可以根据项目需求自行添加其他接口。

6. SpringSecurity中配置 (看需求使用)

如果Spring Boot项目中集成了Spring Security,接口会被拦截,需要在Spring Security的配置类中重写configure方法,对接口进行过滤一下。代码如下:

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring()
            .antMatchers("/swagger-ui.html")
            .antMatchers("/v2/**")
            .antMatchers("/swagger-resources/**");
}

三、SpringBoot集成swagger3

Swagger3在Swagger2的基础上进行了部分升级, 使用和Swagger2没有多少区别。
一个重要的优化是依赖的引入,由之前的多个依赖变更为一个依赖,跟随springboot-starter风格,同时引入了新的开关注解 @EnableOpenApi 以代替@EnableSwagger2 。
因此,集成工作变得更加的简便了,必要工作只有两个,添加swagger3的starter依赖包,在springboot主程序类添加@EnableOpenApi开关注解。

1. 引入依赖 springfox-boot-starter

<!-- 引入Swagger3依赖 -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

2. 新建SwaggerConfig配置类

然后是替换注解: swagger2使用的开启注解是: @EnableSwagger2
而在swagger3中,这个注解要换成: @EnableOpenApi

/**
* Swagger配置类
*/
@Configuration
@EnableOpenApi
public class SwaggerConfig {
    @Bean
    public Docket docket(){
      // 构造方面里面的对象 和v2的不一样
       return new Docket(DocumentationType.OAS_30)
                .apiInfo(apiInfo())
                .enable(true)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example"))
                .paths(PathSelectors.any())
                .build();
    }
    
    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                .title("XX项目接口文档")
                .description("XX项目描述")
                .contact(new Contact("作者", "作者URL", "作者Email"))
                .version("1.0")
                .build();
    }
}

3. 在你的Controller上添加swagger注解

@Api(tags="用户管理")
@RestController
@RequestMapping("/user")
public class UserController {

    @ApiOperation("用户列表")
    @GetMapping("/{id}")
    public JsonResult getViewObjectMapping(@PathVariable("id") Long id) throws Exception{
        return super.getViewObject(id, UserVO.class);
    }

}

4. 启动应用,访问 ip:端口/swagger-ui/index.html (默认皮的情况下)

访问地址和v2版本有点不一样了,改为 localhost:8080/swagger-ui/index.html 了。

参考文章
【1】SpringBoot之整合Swagger2(完整版)
【2】SpringBoot整合Swagger2(完整版)
【3】SpringBoot教程(十六) | SpringBoot集成swagger(全网最全)
【4】springboot 2.7版本整合swagger2代码实现
【5】【Swagger】maven项目整合Swagger(含Springfox3.0与spring boot 2.6.0及以上版本冲突解决办法)
【6】一篇搞定SpringBoot任意版本集成Swagger各种版本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值