swagger的公用配置
@ConfigurationProperties("my.swagger")
@Getter
@Setter
public class SwaggerProperties {
/**
* swagger2默认的url后缀
*/
private String swagger2Url = "/v2/api-docs";
private String oas30Url = "/v3/api-docs";
private String swaggerVersion = "2.0";
/**
* 自动生成文档的路由名称,设置了generateRoutes之后,ignoreRoutes不生效
*/
private Set<String> generateRoutes = new HashSet<>();
/**
* 不自动生成文档的路由名称,设置了generateRoutes之后,本配置不生效
*/
private Set<String> ignoreRoutes = new HashSet<>();
/**
* 是否显示该路由
*/
public boolean isShow(String route) {
int generateRoutesSize = generateRoutes.size();
int ignoreRoutesSize = ignoreRoutes.size();
if (generateRoutesSize > 0 && !generateRoutes.contains(route)) {
return false;
}
if (ignoreRoutesSize > 0 && ignoreRoutes.contains(route)) {
return false;
}
return true;
}
}
网关 Swagger 资源提供程序
gateway 路由的方式聚合swagger文档
@EnableConfigurationProperties(SwaggerProperties.class)
@Primary
public class GatewaySwaggerResourceProvider implements SwaggerResourcesProvider {
@Resource
private SwaggerProperties swaggerProperties;
private final RouteLocator routeLocator;
private final GatewayProperties gatewayProperties;
@Autowired
public GatewaySwaggerResourceProvider(RouteLocator routeLocator, GatewayProperties gatewayProperties) {
this.routeLocator = routeLocator;
this.gatewayProperties = gatewayProperties;
}
/**
* 获取所有的swagger资源配置
*
* @return
*/
@Override
public List<SwaggerResource> get() {
List<SwaggerResource> resources = new ArrayList<>();
Set<String> routes = new HashSet<>();
//取出Spring Cloud Gateway中的route
routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
//结合application.yml中的路由配置,只获取有效的route节点
gatewayProperties.getRoutes().stream().filter(
routeDefinition -> (
routes.contains(routeDefinition.getId()) && swaggerProperties.isShow(routeDefinition.getId())
)
).forEach(routeDefinition -> routeDefinition.getPredicates().stream()
.filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName()))
.forEach(predicateDefinition -> resources.add(
swaggerResource(
routeDefinition.getId(),
predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0").replace("/**", swaggerProperties.getSwagger2Url())
)
)
)
);
return resources;
}
private SwaggerResource swaggerResource(String name, String location) {
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setName(name);
swaggerResource.setLocation(location);
swaggerResource.setSwaggerVersion(swaggerProperties.getSwaggerVersion());
return swaggerResource;
}
}
这里使用的SpringBoot的自动装配
文件夹的结构为
文件内的内容为
Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
com.mn.swagger.SwaggerProperties,
com.mn.swagger.GatewaySwaggerResourceProvider