以前 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@EnableSwagger2WebMvcpublic class Knife4jConfiguration {/*引入Knife4j 提供的扩展类*/private final OpenApiExtensionResolver openApiExtensionResolver;@Autowiredpublic 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;}@Beanpublic 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 {@Overridepublic String nameFor(Class<?> type) {// 这里将特殊字符 . 换成下划线return type.getName().replaceAll("\\.", "_");}@Overridepublic boolean supports(DocumentationType delimiter) {return true;}}
下面是 yml 中的配置(其实不太重要,和本次要解决的重名问题没有任何关系,算是一个入门 demo 吧)
knife4j:enable: true# 生产环境屏蔽资源production: falsedocuments:- name: 使用 API 必读locations: classpath:api-markdowns/*
model 命名的不同下面截图有比较
<br />通过对比发现:只要$ref值没有#/definitions`开头的路径,在下图的请求参数和响应参数里面就看不到具体的参数信息。
