一、swagger简介
简单说明一下,Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务的接口文档。
二、SpringBoot集成swagger
本次集成使用springboot + maven 构建的web项目。
第一步:
pom文件引入依赖
1 <!-- swagger2 --> 2 <dependency> 3 <groupId>io.springfox</groupId> 4 <artifactId>springfox-swagger2</artifactId> 5 <version>2.9.2</version> 6 </dependency> 7 8 <!-- swagger2官方UI --> 9 <dependency> 10 <groupId>io.springfox</groupId> 11 <artifactId>springfox-swagger-ui</artifactId> 12 <version>2.9.2</version> 13 </dependency> 14 15 <!-- 第三方UI --> 16 <dependency> 17 <groupId>com.github.xiaoymin</groupId> 18 <artifactId>swagger-bootstrap-ui</artifactId> 19 <version>1.9.6</version> 20 </dependency>
第二步:
写配置文件
1 import org.springframework.context.annotation.Bean; 2 import org.springframework.context.annotation.Configuration; 3 import springfox.documentation.builders.ApiInfoBuilder; 4 import springfox.documentation.builders.PathSelectors; 5 import springfox.documentation.builders.RequestHandlerSelectors; 6 import springfox.documentation.service.ApiInfo; 7 import springfox.documentation.service.Contact; 8 import springfox.documentation.spi.DocumentationType; 9 import springfox.documentation.spring.web.plugins.Docket; 10 import springfox.documentation.swagger2.annotations.EnableSwagger2; 11 12 /** 13 * @description: Swagger2配置类 14 * @author: WhiteCrowZHZ 15 * @date: 2022/2/16 7:52 16 */ 17 18 @Configuration 19 @EnableSwagger2 20 public class Swagger2 { 21 22 /** 23 * 配置swagger2核心配置 24 * @return 25 */ 26 @Bean 27 public Docket createRestApi() { 28 return new Docket(DocumentationType.SWAGGER_2) // 指定api类型为swagger2 29 .apiInfo(apiInfo()) // 定义api文档汇总信息 30 .select().apis(RequestHandlerSelectors.basePackage("com.example.demo.controller")) // 指定需要提供文档的Controller类所在的包 31 .paths(PathSelectors.any()) // 需要生成文档的接口路径 32 .build(); 33 } 34 35 private ApiInfo apiInfo() { 36 return new ApiInfoBuilder() 37 .title("这是接口文档页的标题") 38 .contact(new Contact( 39 "name", 40 "http://example.com", 41 "example@qq.com")) 42 .description("这是一段关于接口文档的描述信息") 43 .version("1.0.1") 44 .termsOfServiceUrl("http://example.com") 45 .build(); 46 } 47 48 49 }
第三步:
接口类上增加相关注解
1 import com.example.demo.model.User; 2 import io.swagger.annotations.Api; 3 import io.swagger.annotations.ApiOperation; 4 import org.springframework.beans.factory.annotation.Autowired; 5 import org.springframework.data.redis.core.RedisTemplate; 6 import org.springframework.web.bind.annotation.GetMapping; 7 import org.springframework.web.bind.annotation.PathVariable; 8 import org.springframework.web.bind.annotation.ResponseBody; 9 import org.springframework.web.bind.annotation.RestController; 10 11 import java.io.Serializable; 12 import java.util.HashMap; 13 import java.util.Map; 14 15 16 @RestController 17 @Api(value = "UserCacheController ") 18 public class UserCacheController { 19 20 //@Autowired 21 //private StringRedisTemplate stringRedisTemplate; 22 23 @Autowired 24 private RedisTemplate<String, Serializable> redisCacheTemplate; 25 26 /** 27 * 获取缓存信息 28 * @param id 29 * @return 30 */ 31 @ApiOperation(value = "从缓存中获取用户信息") 32 @GetMapping(value = "/cache/user/getCacheUser/{id}") 33 @ResponseBody 34 public Map<String, Object> getCacheUser(@PathVariable Long id) { 35 Map<String, Object> result = new HashMap<String, Object>(); 36 result.put("code", "000000"); 37 result.put("msg", "success"); 38 User u = (User) redisCacheTemplate.opsForValue().get(String.valueOf(1)); 39 System.out.println(u.getUserName()); 40 result.put("body", u); 41 return result; 42 } 43 44 @ApiOperation(value = "将用户信息存入缓存") 45 @GetMapping(value = "/cache/user/cacheUser") 46 @ResponseBody 47 public Map<String, Object> cacheUser() { 48 Map<String, Object> result = new HashMap<String, Object>(); 49 result.put("code", "000000"); 50 result.put("msg", "success"); 51 User u = new User(); 52 u.setId("1"); 53 u.setAge("23"); 54 u.setUserName("huangjinjin"); 55 result.put("body", u); 56 redisCacheTemplate.opsForValue().set(String.valueOf(u.getId()), u); 57 return result; 58 } 59 60 }
注意这里的@Api注解,写在类上的,与我们的配置类相对应。介绍一下相关的注解
@Api: 描述 Controller
@ApiIgnore: 忽略该 Controller,指不对当前类做扫描
@ApiOperation: 描述 Controller类中的 method接口
@ApiParam: 单个参数描述,与@ApiImplicitParam不同的是,他是写在参数左侧的。如( @ApiParam(name="username",value="用户名")Stringusername)
@ApiModel: 描述 POJO对象
@ApiProperty: 描述 POJO对象中的属性值
@ApiImplicitParam: 描述单个入参信息
@ApiImplicitParams: 描述多个入参信息
@ApiResponse: 描述单个出参信息
@ApiResponses: 描述多个出参信息
@ApiError: 接口错误所返回的信息
接下来就是启动项目,访问http://localhost:8885/swagger-ui.html这个地址,这里的8885是我的项目设置端口号.
三、出现的问题
出现原因分析
本人的springboot版本是最新的2.6.9,swagger版本是2.9.2,按着网上的步骤进行环境配置,但在运行时却会出现Failed to start bean ‘documentationPluginsBootstrapper’的问题,在排查了多方原因后,我发现是springboot的版本更新,导致的swagger2的异常
解决方法
(本人的解决方法)在application.properties文件里增加配置:
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
原因是在springboot2.6.6中将SpringMVC 默认路径匹配策略从AntPathMatcher 更改为PathPatternParser,导致出错,解决办法是切换回原先的AntPathMatcher
参考 https://blog.csdn.net/yangzhanghui/article/details/124063438