这个功能很实用从网上学来的,看成品代码如下
package com.xxx.swagger2;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.async.DeferredResult;
import springfox.documentation.RequestHandler;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @author qzc
* @date 2021/1/13
*/
@Configuration
@EnableSwagger2
public class Swagger2 {
// 定义分隔符
private static final String splitor = ";";
/**
* 如果是一个路径apis函数中用springfox.documentation.builders.RequestHandlerSelectors.basePackage
* 多个路径,用自定义函数basePackage
* */
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
// 测试API可设置不同组,ui界面看到api不一样
.groupName("test")
.genericModelSubstitutes(DeferredResult.class)
// .genericModelSubstitutes(ResponseEntity.class)
.useDefaultResponseMessages(false)
.forCodeGeneration(true)
// .pathMapping("/")// base,最终调用接口后会和paths拼接在一起
.select()
.apis(basePackage("com.xxx.controller"+splitor+"com.yyy.scheduletask"))
//.paths(PathSelectors.regex("/cat/.*"))// 过滤的接口
//任何路径
.paths(PathSelectors.any())
.build();
}
/**
* 构建 api文档的详细信息函数
*
* @return
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("多式联运后台管理系统API接口文档")
.description("多式联运后台管理系统API接口文档")
.version("V1.0.0")
.termsOfServiceUrl("http://127.0.0.1:8080/v1/swagger-ui.html")
.contact(new Contact("qzc","http://xxx.com","qzc1998@qq.com"))
.license("Version 1.0")
.licenseUrl("http://127.0.0.1:8080/v1/swagger-ui.html")
.build();
}
/**
* https://zhuanlan.zhihu.com/p/59147622
* Spring boot集成Swagger,并配置多个扫描路径
* */
public static Predicate<RequestHandler> basePackage(final String basePackage) {
return input -> declaringClass(input).transform(handlerPackage(basePackage)).or(true);
}
private static Function<Class<?>, Boolean> handlerPackage(final String basePackage) {
return input -> {
// 循环判断匹配
for (String strPackage : basePackage.split(splitor)) {
boolean isMatch = input.getPackage().getName().startsWith(strPackage);
if (isMatch) {
return true;
}
}
return false;
};
}
private static Optional<? extends Class<?>> declaringClass(RequestHandler input) {
return Optional.fromNullable(input.declaringClass());
}
}
另外mybatis新增映射,初始化结构类,注意字段对象为null之类的,有报错映射会失败