Commit 71ab1187 by Nepxion

支持Swagger多包扫描路径

parent e2eb4057
......@@ -9,15 +9,16 @@ package com.nepxion.discovery.console.configuration;
* @version 1.0
*/
import springfox.documentation.RequestHandler;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
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;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
......@@ -25,14 +26,20 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
@Configuration
@EnableSwagger2
@ConditionalOnProperty(value = "swagger.service.enabled", matchIfMissing = true)
public class SwaggerConfiguration implements WebMvcConfigurer {
public static final String BASE_PACKAGE = "com.nepxion.discovery.console.endpoint";
@Value("${spring.application.name}")
private String serviceName;
@Value("${swagger.service.base.package:com.nepxion.discovery.console.endpoint}")
@Value("${swagger.service.base.package:}")
private String basePackage;
@Value("${swagger.service.description:Console Restful APIs}")
......@@ -56,6 +63,9 @@ public class SwaggerConfiguration implements WebMvcConfigurer {
@Value("${swagger.service.contact.email:1394997@qq.com}")
private String contactEmail;
@Value("${swagger.service.termsOfServiceUrl:http://www.nepxion.com")
private String termsOfServiceUrl;
@Value("${swagger.cors.registry.enabled:true}")
private Boolean corsRegistryEnabled;
......@@ -64,7 +74,7 @@ public class SwaggerConfiguration implements WebMvcConfigurer {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage(basePackage)) // 扫描该包下的所有需要在Swagger中展示的API,@ApiIgnore注解标注的除外
.apis(SwaggerConfiguration.basePackage(BASE_PACKAGE + (StringUtils.isNotEmpty(basePackage.trim()) ? "," + basePackage.trim() : StringUtils.EMPTY))) // 扫描该包下的所有需要在Swagger中展示的API,@ApiIgnore注解标注的除外
.paths(PathSelectors.any())
.build();
}
......@@ -77,6 +87,7 @@ public class SwaggerConfiguration implements WebMvcConfigurer {
.license(license)
.licenseUrl(licenseUrl)
.contact(new Contact(contactName, contactUrl, contactEmail))
.termsOfServiceUrl(termsOfServiceUrl)
.build();
}
......@@ -90,4 +101,35 @@ public class SwaggerConfiguration implements WebMvcConfigurer {
.allowedOrigins("*");
}
}
public static Predicate<RequestHandler> basePackage(String basePackage) {
return new Predicate<RequestHandler>() {
@Override
public boolean apply(RequestHandler input) {
return declaringClass(input).transform(handlerPackage(basePackage)).or(true);
}
};
}
private static Function<Class<?>, Boolean> handlerPackage(String basePackage) {
return new Function<Class<?>, Boolean>() {
@Override
public Boolean apply(Class<?> input) {
String[] subPackages = basePackage.split(",");
for (String subPackage : subPackages) {
boolean matched = input.getPackage().getName().startsWith(subPackage.trim());
if (matched) {
return true;
}
}
return false;
}
};
}
@SuppressWarnings("deprecation")
private static Optional<? extends Class<?>> declaringClass(RequestHandler input) {
return Optional.fromNullable(input.declaringClass());
}
}
\ No newline at end of file
......@@ -9,15 +9,16 @@ package com.nepxion.discovery.plugin.admincenter.configuration;
* @version 1.0
*/
import springfox.documentation.RequestHandler;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
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;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
......@@ -26,15 +27,21 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
@Configuration
@EnableSwagger2
@ConditionalOnClass(name = { "javax.servlet.ServletContext" }) // 适配Spring Cloud Api Gateway,不装载Swagger
@ConditionalOnProperty(value = "swagger.service.enabled", matchIfMissing = true)
public class SwaggerConfiguration implements WebMvcConfigurer {
public static final String BASE_PACKAGE = "com.nepxion.discovery.plugin.admincenter.endpoint";
@Value("${spring.application.name}")
private String serviceName;
@Value("${swagger.service.base.package:com.nepxion.discovery.plugin.admincenter.endpoint}")
@Value("${swagger.service.base.package:}")
private String basePackage;
@Value("${swagger.service.description:Admin Center Restful APIs}")
......@@ -58,6 +65,9 @@ public class SwaggerConfiguration implements WebMvcConfigurer {
@Value("${swagger.service.contact.email:1394997@qq.com}")
private String contactEmail;
@Value("${swagger.service.termsOfServiceUrl:http://www.nepxion.com")
private String termsOfServiceUrl;
@Value("${swagger.cors.registry.enabled:true}")
private Boolean corsRegistryEnabled;
......@@ -66,7 +76,7 @@ public class SwaggerConfiguration implements WebMvcConfigurer {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage(basePackage)) // 扫描该包下的所有需要在Swagger中展示的API,@ApiIgnore注解标注的除外
.apis(SwaggerConfiguration.basePackage(BASE_PACKAGE + (StringUtils.isNotEmpty(basePackage.trim()) ? "," + basePackage.trim() : StringUtils.EMPTY))) // 扫描该包下的所有需要在Swagger中展示的API,@ApiIgnore注解标注的除外
.paths(PathSelectors.any())
.build();
}
......@@ -79,6 +89,7 @@ public class SwaggerConfiguration implements WebMvcConfigurer {
.license(license)
.licenseUrl(licenseUrl)
.contact(new Contact(contactName, contactUrl, contactEmail))
.termsOfServiceUrl(termsOfServiceUrl)
.build();
}
......@@ -92,4 +103,35 @@ public class SwaggerConfiguration implements WebMvcConfigurer {
.allowedOrigins("*");
}
}
public static Predicate<RequestHandler> basePackage(String basePackage) {
return new Predicate<RequestHandler>() {
@Override
public boolean apply(RequestHandler input) {
return declaringClass(input).transform(handlerPackage(basePackage)).or(true);
}
};
}
private static Function<Class<?>, Boolean> handlerPackage(String basePackage) {
return new Function<Class<?>, Boolean>() {
@Override
public Boolean apply(Class<?> input) {
String[] subPackages = basePackage.split(",");
for (String subPackage : subPackages) {
boolean matched = input.getPackage().getName().startsWith(subPackage.trim());
if (matched) {
return true;
}
}
return false;
}
};
}
@SuppressWarnings("deprecation")
private static Optional<? extends Class<?>> declaringClass(RequestHandler input) {
return Optional.fromNullable(input.declaringClass());
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment