Knife4官网
https://doc.xiaominfo.com/knife4j/,根据用户指南可直接集成到项目中,这里就记录一下集成过程。
引入过程
依赖
<!-- knife4j -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>2.0.9</version>
</dependency>
配置类
@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfiguration {
@Bean(value = "defaultApi2")
public Docket defaultApi2() {
Docket docket = new Docket(DocumentationType.SWAGGER_2)
.apiInfo(new ApiInfoBuilder()
.title("标题")
.description("描述")
.termsOfServiceUrl("http://www.xx.com/")
.contact("xxx@qq.com")
.version("1.0")
.build())
//分组名称
.groupName("2.X版本")
.select()
//这里指定Controller扫描包路径
.apis(basePackage("com.xx.controller")
.paths(PathSelectors.any())
.build();
return docket;
}
过滤拦截路径
项目中有配置拦截,所以需要将knife4j的相关路径放行。
此处使用的是Shiro,根据自己的框架进行不同的配置
filterMap.put("/swagger-resources", "anon");
filterMap.put("/swagger-resources/configuration/ui", "anon");
filterMap.put("/v2/api-docs", "anon");
filterMap.put("/v2/api-docs-ext", "anon");
filterMap.put("/doc.html", "anon");
filterMap.put("/webjars/*", "anon");
filterMap.put("/favicon.ico", "anon");
/*
/swagger-resources
/swagger-resources/configuration/ui
/v2/api-docs
/v2/api-docs-ext
/doc.html
/webjars/*
/favicon.ico
*/
访问
启动项目->访问地址:http://localhost:端口号/项目的context-path/doc.html。以上流程基本实现了简单的导入。
增强模式
使用knife4j-spring-boot-strater组件自动装载在yaml中开启增强模式。
knife4j:
#开启增强配置
enable: true
#开启生产环境屏蔽
production: false
basic:
enable: true
username: account
password: password
多包扫描
因为项目中需要扫描的包是分散的,所以需要配置多包扫描。
在Knife4jConfiguration中增加以下方法,将原basePackage重写。
private static final String splitor = ";";
public static Predicate<RequestHandler> basePackage(final String basePackage) {
return input -> declaringClass(input).map(handlerPackage(basePackage)::apply).orElse(true);
}
private static Function<Class<?>, Boolean> handlerPackage(final String basePackage) {
return input -> {
for (String strPackage : basePackage.split(splitor)) {
assert input != null;
boolean isMatch = input.getPackage().getName().startsWith(strPackage);
if (isMatch) {
return true;
}
}
return false;
};
}
private static Optional<Class<?>> declaringClass(RequestHandler input) {
return Optional.ofNullable(input.declaringClass());
}
更改docket中扫描包的方法
.apis(basePackage("com.xxx.controller" + splitor + "com.yyy.controller"))
以上集成完毕。