package cn.besteam.config; import cn.besteam.common.api.vo.Result; import cn.besteam.common.constant.CommonConstant; import com.fasterxml.classmate.TypeResolver; import com.google.common.base.Predicate; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.context.request.async.DeferredResult; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.ParameterBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.schema.AlternateTypeRule; import springfox.documentation.schema.ModelRef; import springfox.documentation.schema.WildcardType; import springfox.documentation.service.Contact; import springfox.documentation.service.Parameter; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Date; import java.util.List; import static springfox.documentation.schema.AlternateTypeRules.newRule; /** * @author scott */ @Slf4j @Configuration @EnableSwagger2 public class Swagger2Config implements WebMvcConfigurer { @Autowired private TypeResolver typeResolver; @Autowired private SysEnv sysEnv; /** * 显示swagger-ui.html文档展示页,还必须注入swagger资源: * * @param registry */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); } @Bean public Docket api() { MyDocket md = new MyDocket("1.移动端接口"); if (sysEnv.isGenApi()) { // 不包含/ops接口 return md.open("cn.besteam.modules", rule(), PathSelectors.ant("/api/**")); } else { return md.close(); } } @Bean public Docket backend() { MyDocket md = new MyDocket("2.后台接口"); if (sysEnv.isGenApi()) { return md.open("cn.besteam.modules", rule(), PathSelectors.regex("^((?!/api).)*$")); } else { return md.close(); } } private AlternateTypeRule rule() { return newRule(typeResolver.resolve(DeferredResult.class, typeResolver.resolve(Result.class, WildcardType.class)), typeResolver.resolve(WildcardType.class)); } /** * 自定义配置类 */ static class MyDocket extends Docket { public MyDocket(String groupName) { super(DocumentationType.SWAGGER_2); this.groupName(groupName); this.apiInfo(new ApiInfoBuilder().title("医疗废物平台接口").description("").contact(new Contact("智云启服全体优秀程序员", "https://www.besteam.cn/", "")).version("1.0").build()); } public Docket open(String basePackage, AlternateTypeRule rule, Predicate pathSelector) { return this.select().apis(RequestHandlerSelectors.basePackage(basePackage)).apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)).paths(pathSelector).build().pathMapping("/").directModelSubstitute(Date.class, String.class).directModelSubstitute(Timestamp.class, String.class).alternateTypeRules(rule).globalOperationParameters(setHeaderToken()).useDefaultResponseMessages(false); } /** * 公共token头部参数 * * @return */ private List setHeaderToken() { ParameterBuilder tokenPar = new ParameterBuilder(); List pars = new ArrayList<>(); tokenPar.name(CommonConstant.X_ACCESS_TOKEN).description("token").modelRef(new ModelRef("string")).parameterType("header").required(false).build(); pars.add(tokenPar.build()); return pars; } /** * 关闭文档 * * @return */ public Docket close() { return this.select().apis(RequestHandlerSelectors.none()).build(); } } }