Spring Cloud Implements Swagger2

This is the 13th day of my participation in Gwen Challenge

The environment that

SpringBoot version: 2.1.3.release

Swagger Version: 2.9.2

SpringCloudGateway version: 2.1.0.release

Create the Gateway Module project and add maven dependencies

<! -- Gateway gateway dependency, built-in webflux dependency -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-gateway-core</artifactId>
    <version>2.1.0. RELEASE</version>
</dependency>
Copy the code

Create the Config (Package) package under the Gateway Module project and add the SwaggerProvider file

import lombok.AllArgsConstructor;
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 org.springframework.cloud.gateway.config.GatewayProperties;
import org.springframework.cloud.gateway.route.RouteLocator;

import java.util.ArrayList;
import java.util.List;



/ * * *@ClassName: SwaggerProvider
 * @Description: aggregate interface document registration *@Author Gxin
 * @Date 2021/6/26 17:03
 * @Version: 1.0 * * /
@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<SwaggerResource> get(a) {
      List<SwaggerResource> resources = new ArrayList<>();
      List<String> routes = new ArrayList<>();
      /** * Obtain the route parameter of the Gateway configuration file */
      routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
      /** * Only valid route nodes */ can be obtained with route-path and route filtering
      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");
      returnswaggerResource; }}Copy the code

Create the Handler package and add the SwaggerHandler file

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;

@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<ResponseEntity<SecurityConfiguration>> securityConfiguration() {
        return Mono.just(new ResponseEntity<>(
                Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK));
    }

    @GetMapping("/configuration/ui")
    public Mono<ResponseEntity<UiConfiguration>> uiConfiguration() {
        return Mono.just(new ResponseEntity<>(
                Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK));
    }

    
    public Mono<ResponseEntity> swaggerResources(a) {
        return Mono.just((newResponseEntity<>(swaggerResources.get(), HttpStatus.OK))); }}Copy the code

Add application.yml under Resources

server:
  port: 8861
spring:
  application:
    name: @artifactId@
  cloud:
    gateway:
      discovery:
        locator:
Gateway enables service registration and discovery
          enabled: true
Set the service name on the request path to lowercase
          lowerCaseServiceId: true
      routes:
        - id: ozx-shop-service-weixin                     # Gateway routing
          uri: lb://OZX-SHOP-SERVICE-WEIXIN
          predicates:
            - Path=/wx/**

eureka:
  instance:
    prefer-ip-address: true
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/
Copy the code

Spring Cloud Implements Swagger2