From fc2d4330f0193ab5bdabb48ee05aedc981029455 Mon Sep 17 00:00:00 2001 From: lhc Date: Mon, 26 Apr 2021 15:39:33 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BD=91=E5=85=B3=E6=96=B0=E5=A2=9Eswagger-ui?= =?UTF-8?q?=EF=BC=8C=E5=BE=AE=E6=9C=8D=E5=8A=A1=E6=96=87=E6=A1=A3=E5=BD=92?= =?UTF-8?q?=E9=9B=86=EF=BC=8C=E5=8F=AF=E6=98=BE=E7=A4=BA=E6=89=80=E6=9C=89?= =?UTF-8?q?=E5=BE=AE=E6=9C=8D=E5=8A=A1=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gateway/swagger/SwaggerHandler.java | 52 ++++++++++++++++++ .../gateway/swagger/SwaggerProvider.java | 54 +++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 hcframe-parent/hcframe-gateway/src/main/java/com/hcframe/gateway/swagger/SwaggerHandler.java create mode 100644 hcframe-parent/hcframe-gateway/src/main/java/com/hcframe/gateway/swagger/SwaggerProvider.java diff --git a/hcframe-parent/hcframe-gateway/src/main/java/com/hcframe/gateway/swagger/SwaggerHandler.java b/hcframe-parent/hcframe-gateway/src/main/java/com/hcframe/gateway/swagger/SwaggerHandler.java new file mode 100644 index 0000000..f4ea593 --- /dev/null +++ b/hcframe-parent/hcframe-gateway/src/main/java/com/hcframe/gateway/swagger/SwaggerHandler.java @@ -0,0 +1,52 @@ +package com.hcframe.gateway.swagger; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Mono; +import springfox.documentation.swagger.web.*; + +import java.util.Optional; + +/** + * @author lhc + * @version 1.0 + * @className SwaggerHandler + * @date 2021年04月25日 5:01 下午 + * @description 描述 + */ +@RestController +@RequestMapping("/swagger-resources") +public class SwaggerHandler { + @Autowired(required = false) + private SecurityConfiguration securityConfiguration; + @Autowired(required = false) + private UiConfiguration uiConfiguration; + private final SwaggerResourcesProvider swaggerResources; + + @Autowired + public SwaggerHandler(SwaggerResourcesProvider swaggerResources) { + this.swaggerResources = swaggerResources; + } + + + @GetMapping("/configuration/security") + public Mono> securityConfiguration() { + return Mono.just(new ResponseEntity<>( + Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK)); + } + + @GetMapping("/configuration/ui") + public Mono> uiConfiguration() { + return Mono.just(new ResponseEntity<>( + Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK)); + } + + @GetMapping("") + public Mono swaggerResources() { + return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK))); + } +} diff --git a/hcframe-parent/hcframe-gateway/src/main/java/com/hcframe/gateway/swagger/SwaggerProvider.java b/hcframe-parent/hcframe-gateway/src/main/java/com/hcframe/gateway/swagger/SwaggerProvider.java new file mode 100644 index 0000000..caa0d87 --- /dev/null +++ b/hcframe-parent/hcframe-gateway/src/main/java/com/hcframe/gateway/swagger/SwaggerProvider.java @@ -0,0 +1,54 @@ +package com.hcframe.gateway.swagger; + +import lombok.AllArgsConstructor; +import org.springframework.cloud.gateway.config.GatewayProperties; +import org.springframework.cloud.gateway.route.RouteLocator; +import org.springframework.cloud.gateway.support.NameUtils; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; +import springfox.documentation.swagger.web.SwaggerResource; +import springfox.documentation.swagger.web.SwaggerResourcesProvider; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author lhc + * @version 1.0 + * @className SwaggerProvider + * @date 2021年04月25日 5:00 下午 + * @description 描述 + */ +@Component +@Primary +@AllArgsConstructor +public class SwaggerProvider implements SwaggerResourcesProvider { + public static final String API_URI = "/v2/api-docs"; + private final RouteLocator routeLocator; + private final GatewayProperties gatewayProperties; + + + @Override + public List get() { + List resources = new ArrayList<>(); + List routes = new ArrayList<>(); + //取出gateway的route + routeLocator.getRoutes().subscribe(route -> routes.add(route.getId())); + //结合配置的route-路径(Path),和route过滤,只获取有效的route节点 + gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(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("/**", API_URI))))); + return resources; + } + + private SwaggerResource swaggerResource(String name, String location) { + SwaggerResource swaggerResource = new SwaggerResource(); + swaggerResource.setName(name); + swaggerResource.setLocation(location); + swaggerResource.setSwaggerVersion("2.0"); + return swaggerResource; + } +}