一、导入依赖
由于原生的 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
@EnableSwagger2WebMvc
public 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 // 声明配置类
@EnableSwagger2WebMvc
public class SwaggerConfig2 {
@Bean
public Docket create() {
Docket docket = new Docket(DocumentationType.SWAGGER_2);
/** 1.设置Swagger的基本信息 */
// ApiInfoBuilder 用于在Swagger界面上添加各种信息
ApiInfoBuilder apiInfoBuilder = new ApiInfoBuilder();
// 添加标题
apiInfoBuilder.title("EMOS在线办公系统");
// 将基本信息封装到 ApiInfo 类中并添加到 docket
ApiInfo 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;
}
}