以前 Knife4j 还是 Swagger 的一个前端皮肤,现在已经变成了一个增强解决方案了
这个是 Knife4j 官方的介绍:Knife4j 是一个集 Swagger2 和 OpenAPI3 为一体的增强解决方案
https://doc.xiaominfo.com/ 是 Knife4j 的官方地址。
快速入门很简单,直接看官方文档吧:https://doc.xiaominfo.com/docs/action/springboot
Model 名称重名解决
Model 名称自动防止重名:比如前面使用 Swagger 的时候遇到的重名 文档,Knife4j 也存在这个问题
只不过 Knife4j 对 model 的命名有要求,类全限定名称里面有特殊符号 .
把它换一下就行了。
比如下面这个配置
// ~ swagger API 文档 ==========================
implementation "io.springfox:springfox-boot-starter:3.0.0"
implementation 'com.github.xiaoymin:knife4j-spring-boot-starter:2.0.9'
package cn.mrcode.autoconfig;
import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver;
import org.springframework.beans.factory.annotation.Autowired;
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.spi.DocumentationType;
import springfox.documentation.spi.schema.TypeNameProviderPlugin;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
/**
* @author mrcode
* @date 2022/11/2 19:35
*/
@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfiguration {
/*引入Knife4j 提供的扩展类*/
private final OpenApiExtensionResolver openApiExtensionResolver;
@Autowired
public Knife4jConfiguration(OpenApiExtensionResolver openApiExtensionResolver) {
this.openApiExtensionResolver = openApiExtensionResolver;
}
@Bean(value = "defaultApi2")
public Docket defaultApi2() {
Docket docket = new Docket(DocumentationType.SWAGGER_2)
.apiInfo(new ApiInfoBuilder()
.title("系统 RESTful APIs")
.description("API 文档")
//.termsOfServiceUrl("http://www.xx.com/")
.version("1.0")
.build())
//分组名称
// .groupName("2.X版本")
.select()
//这里指定Controller扫描包路径
.apis(RequestHandlerSelectors.basePackage("cn.mrcode.web.controller"))
.paths(PathSelectors.any())
.build()
//赋予插件体系
.extensions(openApiExtensionResolver.buildExtensions("default"));
;
return docket;
}
@Bean
public TypeNameProviderPlugin typeNameProviderPlugin() {
return new MyTypeNameProviderPlugin();
}
}
package cn.mrcode.autoconfig;
import org.springframework.core.annotation.Order;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.schema.TypeNameProviderPlugin;
import springfox.documentation.swagger.common.SwaggerPluginSupport;
/**
* @author mrcode
* @date 2022/11/2 17:50
*/
@Order(SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER - 100)
public class MyTypeNameProviderPlugin implements TypeNameProviderPlugin {
@Override
public String nameFor(Class<?> type) {
// 这里将特殊字符 . 换成下划线
return type.getName().replaceAll("\\.", "_");
}
@Override
public boolean supports(DocumentationType delimiter) {
return true;
}
}
下面是 yml 中的配置(其实不太重要,和本次要解决的重名问题没有任何关系,算是一个入门 demo 吧)
knife4j:
enable: true
# 生产环境屏蔽资源
production: false
documents:
- name: 使用 API 必读
locations: classpath:api-markdowns/*
model 命名的不同下面截图有比较
![NVRRPTVG4W$}R6(UT1CW[8.png](https://cdn.nlark.com/yuque/0/2022/png/651749/1667439480616-69855c0f-7ba9-4b28-abec-4becd6f3b2c0.png#averageHue=%23fdfcfc&clientId=u98f12cef-38bb-4&crop=0&crop=0&crop=1&crop=1&errorMessage=unknown%20error&from=paste&height=708&id=ub861dcc4&margin=%5Bobject%20Object%5D&name=NVRRPT%60VG4W%24%7DR6%28UT1CW%5B8.png&originHeight=885&originWidth=1568&originalType=binary&ratio=1&rotation=0&showTitle=false&size=171950&status=error&style=none&taskId=ucd076dcd-bb84-4046-842a-d4c12140c1f&title=&width=1254.4)<br />通过对比发现:只要
$ref值没有
#/definitions`开头的路径,在下图的请求参数和响应参数里面就看不到具体的参数信息。