SpringBoot-Swager的使用

it2023-11-06  64

1.Swager简介

号称世界上最流行的Api框架;RestFul Api 文档在线自动生成工具=>Api文档与API定义同步更新直接运行,可以在线测试API接口支持多种语言;(java、PHP…)

在项目中使用Swagger需要Springbox;

swagger2ui

2.使用Swagger

创建一个Springboot项目(添加web依赖)

引入相关的jar包

<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency>

编写Controller类测试项目是否能够运行

配置swagger===>>>Config

@Configuration @EnableSwagger2 //开启Swagger2 public class SwaggerConfig { }

访问:http://localhost:8080/swagger-ui.html,进入swagger首页

配置Swagger的属性

package com.ddf.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; import java.util.ArrayList; @Configuration @EnableSwagger2 //开启Swagger2 public class SwaggerConfig { //配置了swagger的Docket的bean实例 @Bean public Docket docket(){ return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()); } //配置Swagger信息=apiInfo //通过自己定义的属性,把原来的Swagger配置的页面信息给覆盖了 public ApiInfo apiInfo(){ //作者信息 Contact contact = new Contact("小火鸡","http://blog.ddf.com/","814655997@qq.com"); return new ApiInfo( "SwaggerAPI的文档", "这是个好东西", "v1.0", "http://blog.ddf.com/", contact, "Apache 2.0", "http://www.apche.org/licenses/LICENSE-2.0", new ArrayList<>() ); } }

可以看出,我们可以自己配置参数覆盖Swagger配置的信息

通过访问的swagger_ui.html页面,我们可以找到他对应的jar包下面有这么一个html

页面;

配置Swagger扫描接口

//配置了swagger的Docket的bean实例 @Bean public Docket docket(){ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() //RequestHandlerSelectors,配置要扫描的接口 //basePackage:指定要扫描的包 //any():扫描全部 //none():不扫描 //withClassAnnotation:扫描类上的注解 .apis(RequestHandlerSelectors.basePackage("com.ddf.controller.MyController")) //paths():过滤什么路径 .paths(PathSelectors.ant("/ddf/**")) .build(); }

配置是否启动Swagger

//配置了swagger的Docket的bean实例 //enable表示是否启动Swagger,如果为false则不启动Swagger @Bean public Docket docket(){ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .enable(false) .select() //RequestHandlerSelectors,配置要扫描的接口 //basePackage:指定要扫描的包 //any():扫描全部 //none():不扫描 //withClassAnnotation:扫描类上的注解 .apis(RequestHandlerSelectors.basePackage("com.ddf.controller.MyController")) //paths():过滤什么路径 .paths(PathSelectors.ant("/ddf/**")) .build(); }

思考题:只希望我的Swagger在生产环境中使用,在发布的时候不使用?(如何解决)

判断是否是生产环境 flag =false然后注入enable(flag)这个值

1.首先配置多个配置文件(dev端口生产环境使用,pro发布的时候使用),通过设置的值判断项目的端口环境

dev访问路径:http://localhost:8081/swagger-ui.html#/

pro访问路径:http://localhost:8082/swagger-ui.html#/

2.获取要使用的Swagger,如果

//配置了swagger的Docket的bean实例 //enable表示是否启动Swagger,如果为false则不启动Swagger @Bean public Docket docket(Environment environment){ //设置要显示的Swagger环境 Profiles profiles = Profiles.of("dev","test"); //获取项目的环境: //通过environment.acceptsProfiles判断是否处在自己设定的环境当中 boolean flag = environment.acceptsProfiles(profiles); return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .enable(flag) .select() //RequestHandlerSelectors,配置要扫描的接口 //basePackage:指定要扫描的包 //any():扫描全部 //none():不扫描 //withClassAnnotation:扫描类上的注解 .apis(RequestHandlerSelectors.basePackage("com.ddf.controller.MyController")) //paths():过滤什么路径 .paths(PathSelectors.ant("/ddf/**")) .build(); }

如果flag为false:就不使用Swagger

配置多个分组;多个Docket实例即可

@Bean public Docket docket1(){ return new Docket(DocumentationType.SWAGGER_2).groupName("A"); } @Bean public Docket docket2(){ return new Docket(DocumentationType.SWAGGER_2).groupName("B"); }@Bean public Docket docket3(){ return new Docket(DocumentationType.SWAGGER_2).groupName("C"); }

效果如下:

实体类配置

创建一个实体类:User

@ApiModel("用户实体类") //给实体类加了文档注释 public class User { @ApiModelProperty("用户名") //给属性加了文档注释 public String userName; @ApiModelProperty("密码") public String password; }

运行效果如下:

Controller类:

package com.ddf.controller; import com.ddf.pojo.User; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MyController { @GetMapping("/index") public String index(){ return "index"; } //只用我们的接口中,返回的值中存在实体类,他就会被扫描到swagger中 @PostMapping("/user") public User user(){ return new User(); } //ApiOperation接口,他不是放在类上面的,是放在方法上的 @ApiOperation("Hello控制类") @GetMapping("/hello2") public String hello2(@ApiParam("用户名") String username){ return "hello2"+ username; } }

总结:

我们可以通过swagger给一些比较难理解的属性或者接口添加注解信息接口文档实时更新可以在线测试
最新回复(0)