一、导入依赖
由于原生的 Swagger 界面实在太丑,所以直接使用[knife4j](https://xiaoym.gitee.io/knife4j/),其官网为:https://xiaoym.gitee.io/knife4j/documentation/get_start.html
注入依赖:
<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>2.0.9</version></dependency>
二、配置 Swagger
@Configuration@EnableSwagger2WebMvcpublic class Knife4jConfiguration {@Bean(value = "defaultApi2")public Docket defaultApi2() {Docket docket=new Docket(DocumentationType.SWAGGER_2).apiInfo(new ApiInfoBuilder()//.title("swagger-bootstrap-ui-demo RESTful APIs").description("# swagger-bootstrap-ui-demo RESTful APIs").termsOfServiceUrl("http://www.xx.com/").contact("xx@qq.com").version("1.0").build())//分组名称.groupName("2.X版本").select()//这里指定Controller扫描包路径.apis(RequestHandlerSelectors.basePackage("com.github.xiaoymin.knife4j.controller")).paths(PathSelectors.any()).build();return docket;}}
三、高版本依赖报错
导入依赖运行项目出现下面错误信息:
Failed to start bean 'documentationPluginsBootstrapper';nested exception is java.lang.NullPointerException
这是因为Spring Boot2.6.0+以上的版本是默认禁止 Bean 的循环引用。
- 解决办法1:就是降低SpringBoot的版本;
- 解决办法2:添加如下配置:
spring:mvc:pathmatch:matching-strategy: ANT_PATH_MATCHER
四、JWT配置
import io.swagger.annotations.ApiOperation;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import springfox.documentation.builders.ApiInfoBuilder;import springfox.documentation.builders.PathSelectors;import springfox.documentation.builders.RequestHandlerSelectors;import springfox.documentation.service.*;import springfox.documentation.spi.DocumentationType;import springfox.documentation.spi.service.contexts.SecurityContext;import springfox.documentation.spring.web.plugins.ApiSelectorBuilder;import springfox.documentation.spring.web.plugins.Docket;import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;import java.util.ArrayList;import java.util.List;@Configuration // 声明配置类@EnableSwagger2WebMvcpublic class SwaggerConfig2 {@Beanpublic Docket create() {Docket docket = new Docket(DocumentationType.SWAGGER_2);/** 1.设置Swagger的基本信息 */// ApiInfoBuilder 用于在Swagger界面上添加各种信息ApiInfoBuilder apiInfoBuilder = new ApiInfoBuilder();// 添加标题apiInfoBuilder.title("EMOS在线办公系统");// 将基本信息封装到 ApiInfo 类中并添加到 docketApiInfo apiInfo = apiInfoBuilder.build();docket.apiInfo(apiInfo);/** 2.设置哪些类的哪些方法添加到Swagger中 */// ApiSelectorBuilder 用来设置哪些类中的方法会生成到REST API中ApiSelectorBuilder apiSelectorBuilder = docket.select();// 设置所有的类都可以被添加到swagger中apiSelectorBuilder.paths(PathSelectors.any()); // PathSelectors.any() 表示包下的所有类// 设置只有方法上包含ApiOperation注解的方法才能被添加到Swagger中// 使用@ApiOperation的方法会被提取到REST API中apiSelectorBuilder.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class));docket = apiSelectorBuilder.build();/** 3.设置JWT单点登录功能* 下面的语句是开启对JWT的支持,当用户用Swagger调用受JWT认证保护的方法时,* 必须要先提交参数(例如令牌)* */// 规定在header(3)中接收令牌,请求头中的参数为token(1),描述信息为token(2)// 存储用户必须提交的参数ApiKey apiKey = new ApiKey("token", "token", "header");List<SecurityScheme> securitySchemeList = new ArrayList<>();// 规定用户需要输入什么参数securitySchemeList.add(apiKey);// swagger就知道了在请求头里面的token参数提交的令牌字符串docket.securitySchemes(securitySchemeList);// 如果Swagger判断的令牌有效,则设置令牌的作用域// 这里设置作用域为全局// 如果用户JWT认证通过,则在Swagger中全局有效AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");AuthorizationScope[] scopes = {authorizationScope};// 存储令牌和作用域SecurityReference reference = new SecurityReference("token", scopes);List<SecurityReference> referenceList = new ArrayList<>();referenceList.add(reference);SecurityContext context = SecurityContext.builder().securityReferences(referenceList).build();List<SecurityContext> contextList = new ArrayList<>();contextList.add(context);docket.securityContexts(contextList);return docket;}}
