1、pom文件
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
2、Knife4j配置文件
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMethod;
import springfox.documentation.RequestHandler;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.builders.ResponseMessageBuilder;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.ResponseMessage;
import springfox.documentation.service.Tag;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
import com.google.common.base.Function;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;
/**
* 自定义版 Knife4j 组件配置文件.
*/
@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfiguration {
/**
* 定义分隔符
*/
private static final String SPLITOR = ";";
@Bean(value = "defaultApi")
public Docket defaultApi() {
List<ResponseMessage> responseMessageList = new ArrayList<>();
responseMessageList.add(new ResponseMessageBuilder().code(200).message("Success").build());
responseMessageList.add(new ResponseMessageBuilder().code(400).message("参数错误").build());
responseMessageList.add(new ResponseMessageBuilder().code(401).message("没有认证").build());
responseMessageList.add(new ResponseMessageBuilder().code(403).message("没有访问权限").build());
responseMessageList.add(new ResponseMessageBuilder().code(404).message("找不到资源").build());
responseMessageList.add(new ResponseMessageBuilder().code(500).message("服务器内部错误").build());
ApiInfo apiInfoBuilder = new ApiInfoBuilder().title("RESTful APIs")
.description("RESTful APIs ~~~~~")
.termsOfServiceUrl("")
.contact(new Contact("", "", ""))
.version("1.0")
.build();
Docket docket = new Docket(DocumentationType.OAS_30)
.useDefaultResponseMessages(false)
.globalResponseMessage(RequestMethod.GET, responseMessageList)
.globalResponseMessage(RequestMethod.POST, responseMessageList)
.globalResponseMessage(RequestMethod.PUT, responseMessageList)
.globalResponseMessage(RequestMethod.DELETE, responseMessageList)
.apiInfo(apiInfoBuilder)
//分组名称
.groupName("appApi")
.enable(true)
.select()
//这里指定Controller扫描包路径
// .apis(RequestHandlerSelectors.basePackage("**.ssp"))
.apis(basePackage(
"**.controller.test1" + SPLITOR
+ "**.controller.test2" + SPLITOR
+ "**.controller.test3" + SPLITOR
+ "**.controller.test4" + SPLITOR
+ "**.controller.test5" + SPLITOR
+ "**.user.test6" + SPLITOR
))
.paths(PathSelectors.any())
.build();
return docket;
}
@Bean(value = "generatorApi")
public Docket generatorApi() {
List<ResponseMessage> responseMessageList = new ArrayList<>();
responseMessageList.add(new ResponseMessageBuilder().code(200).message("Success").build());
responseMessageList.add(new ResponseMessageBuilder().code(400).message("参数错误").build());
responseMessageList.add(new ResponseMessageBuilder().code(401).message("没有认证").build());
responseMessageList.add(new ResponseMessageBuilder().code(403).message("没有访问权限").build());
responseMessageList.add(new ResponseMessageBuilder().code(404).message("找不到资源").build());
responseMessageList.add(new ResponseMessageBuilder().code(500).message("服务器内部错误").build());
ApiInfo apiInfoBuilder = new ApiInfoBuilder().title("RESTful APIs")
.description("接口 RESTful APIs ~~~~~")
.termsOfServiceUrl("")
.contact(new Contact("", "", ""))
.version("1.0")
.build();
Docket docket = new Docket(DocumentationType.OAS_30)
.useDefaultResponseMessages(false)
.globalResponseMessage(RequestMethod.GET, responseMessageList)
.globalResponseMessage(RequestMethod.POST, responseMessageList)
.globalResponseMessage(RequestMethod.PUT, responseMessageList)
.globalResponseMessage(RequestMethod.DELETE, responseMessageList)
.apiInfo(apiInfoBuilder)
//分组名称
.groupName("generatorApi")
.enable(true)
.select()
//这里指定Controller扫描包路径
// .apis(RequestHandlerSelectors.basePackage("**.app.controller.test11"))
.apis(basePackage(
"**.**.controller" + SPLITOR
+ "**.**.controller.test22.test33" + SPLITOR
))
.paths(PathSelectors.any())
.build();
return docket;
}
/**
* @description 重写basePackage方法,使能够实现多包访问
* @param basePackage 所有包路径
* @return Predicate<RequestHandler>
*/
public static Predicate<RequestHandler> basePackage(final String basePackage) {
return input -> declaringClass(input).map(handlerPackage(basePackage)::apply).orElse(true);
}
/**
* @description 重写basePackage方法,使能够实现多包访问
* @param basePackage 所有包路径
* @return Function<Class<?>, Boolean>
*/
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;
};
}
/**
* @description 重写basePackage方法,使能够实现多包访问
* @param input
* @return Optional<? extends Class<?>>
*/
private static Optional<Class<?>> declaringClass(RequestHandler input) {
return Optional.ofNullable(input.declaringClass());
}
}
注:我的一部分controller是在src/main/java/*/**/***/****/controller(路径1)下的不同包下,另一部分controller在src/main/java/*/**/***/generator(路径2)下,而且这2个部分的controller还有不同的子包,所以,我把路径1的所有controller路径放在一个Docket下,路径2的所有controller路径放在另一个Docket下,全部交给Spring管理,进行分组展示。
3、controller
@Api(tags = "首页模块")
@RestController
@RequestMapping("app/common")
public class AppHomeController {
@ApiImplicitParam(name = "name",value = "姓名",required = true)
@ApiOperation(value = "向客人问好")
@GetMapping("/sayHi")
public ResponseEntity<String> sayHi(@RequestParam(value = "name")String name){
return ResponseEntity.ok("Hi:"+name);
}
}
4、测试:localhost:端口/doc.html