Browse Source

swagger聚合

yubin 4 ngày trước cách đây
mục cha
commit
2912959308

+ 8 - 2
pom.xml

@@ -306,10 +306,16 @@
             <scope>test</scope>
         </dependency>
 
+<!--        <dependency>-->
+<!--            <groupId>org.springdoc</groupId>-->
+<!--            <artifactId>springdoc-openapi-ui</artifactId>-->
+<!--            <version>1.6.14</version>-->
+<!--        </dependency>-->
+
         <dependency>
             <groupId>org.springdoc</groupId>
-            <artifactId>springdoc-openapi-ui</artifactId>
-            <version>1.6.14</version>
+            <artifactId>springdoc-openapi-webflux-ui</artifactId>
+            <version>1.6.15</version>
         </dependency>
 
         <dependency>

+ 90 - 0
src/main/java/com/txz/project/configurer/OpenApiConfig.java

@@ -0,0 +1,90 @@
+package com.txz.project.configurer;
+
+import io.swagger.v3.oas.models.Components;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.security.SecurityRequirement;
+import io.swagger.v3.oas.models.security.SecurityScheme;
+import org.springdoc.core.GroupedOpenApi;
+import org.springdoc.core.SwaggerUiConfigParameters;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.gateway.route.RouteDefinitionLocator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@Configuration
+public class OpenApiConfig {
+
+    private final RouteDefinitionLocator routeDefinitionLocator;
+
+    @Value("${spring.application.name}")
+    private String applicationName;
+
+    public OpenApiConfig(RouteDefinitionLocator routeDefinitionLocator) {
+        this.routeDefinitionLocator = routeDefinitionLocator;
+    }
+
+    /**
+     * 配置API文档基本信息,包含全局请求头
+     */
+    @Bean
+    public OpenAPI customOpenAPI() {
+        // 1. 定义自定义请求头的安全方案
+        SecurityScheme customHeaderScheme = new SecurityScheme()
+                .type(SecurityScheme.Type.APIKEY)
+                .name("Custom-Header") // 请求头名称
+                .in(SecurityScheme.In.HEADER); // 位置:请求头
+
+        // 2. 定义安全要求(全局应用)
+        SecurityRequirement securityRequirement = new SecurityRequirement();
+        securityRequirement.addList("CustomHeaderSecurity"); // 关联安全方案的名称
+
+        // 3. 注册组件(关键:将安全方案添加到components中)
+        Components components = new Components();
+        components.addSecuritySchemes("CustomHeaderSecurity", customHeaderScheme);
+
+        // 4. 构建OpenAPI对象
+        return new OpenAPI()
+                .openapi("3.0.1")
+                .info(new Info()
+                        .title(applicationName + " API Gateway")
+                        .version("1.0")
+                        .description("API Gateway for Microservices Documentation"))
+                .components(components) // 注册组件
+                .security(Collections.singletonList(securityRequirement)); // 全局应用安全要求
+    }
+
+    /**
+     * 聚合各微服务的API文档
+     */
+    @Bean
+    @Lazy(false)
+    public List<GroupedOpenApi> apis(SwaggerUiConfigParameters swaggerUiConfigParameters) {
+        List<GroupedOpenApi> groups = new ArrayList<>();
+
+        // 为mall服务创建分组
+        String mallServiceId = "mall";
+        swaggerUiConfigParameters.addGroup(mallServiceId);
+        groups.add(GroupedOpenApi.builder()
+                .group(mallServiceId)
+                .pathsToMatch("/" + mallServiceId + "/**")
+                .build());
+
+        // 为cif服务创建分组
+        String cifServiceId = "cif";
+        swaggerUiConfigParameters.addGroup(cifServiceId);
+        groups.add(GroupedOpenApi.builder()
+                .group(cifServiceId)
+                .pathsToMatch("/" + cifServiceId + "/**")
+                .build());
+
+
+
+        return groups;
+    }
+}

+ 44 - 44
src/main/java/com/txz/project/configurer/SwaggerConfig.java

@@ -1,44 +1,44 @@
-package com.txz.project.configurer;
-
-import io.swagger.v3.oas.models.Components;
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.info.Contact;
-import io.swagger.v3.oas.models.info.Info;
-import io.swagger.v3.oas.models.info.License;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Profile;
-
-
-@Configuration
-@Profile({"dev", "test"})
-public class SwaggerConfig {
-    
-    @Bean
-    public OpenAPI customOpenAPI() {
-        return new OpenAPI()
-                .components(new Components()
-                        .addParameters("token", new Parameter()
-                                .name("token")
-                                .description("user token")
-                                .required(false)
-                                .in("header"))
-                        .addParameters("appCode", new Parameter()
-                                .name("appCode")
-                                .description("appCode")
-                                .required(false)
-                                .in("header")))
-                .info(new Info()
-                        .title("API接口文档")
-                        .description("swagger2 demo api")
-                        .version("1.0")
-                        .contact(new Contact()
-                                .name("admin")
-                                .url("http://localhost/swagger-ui.html")
-                                .email("xxx@qq.com"))
-                        .license(new License()
-                                .name("Apache 2.0")
-                                .url("http://localhost/swagger-ui.html")));
-    }
-}
+//package com.txz.project.configurer;
+//
+//import io.swagger.v3.oas.models.Components;
+//import io.swagger.v3.oas.models.OpenAPI;
+//import io.swagger.v3.oas.models.info.Contact;
+//import io.swagger.v3.oas.models.info.Info;
+//import io.swagger.v3.oas.models.info.License;
+//import io.swagger.v3.oas.models.parameters.Parameter;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.context.annotation.Profile;
+//
+//
+//@Configuration
+//@Profile({"dev", "test"})
+//public class SwaggerConfig {
+//
+//    @Bean
+//    public OpenAPI customOpenAPI() {
+//        return new OpenAPI()
+//                .components(new Components()
+//                        .addParameters("token", new Parameter()
+//                                .name("token")
+//                                .description("user token")
+//                                .required(false)
+//                                .in("header"))
+//                        .addParameters("appCode", new Parameter()
+//                                .name("appCode")
+//                                .description("appCode")
+//                                .required(false)
+//                                .in("header")))
+//                .info(new Info()
+//                        .title("API接口文档")
+//                        .description("swagger2 demo api")
+//                        .version("1.0")
+//                        .contact(new Contact()
+//                                .name("admin")
+//                                .url("http://localhost/swagger-ui.html")
+//                                .email("xxx@qq.com"))
+//                        .license(new License()
+//                                .name("Apache 2.0")
+//                                .url("http://localhost/swagger-ui.html")));
+//    }
+//}

+ 37 - 1
src/main/resources/bootstrap.properties

@@ -106,4 +106,40 @@ spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[4]=DELE
 
 spring.messages.basename=i18n/messages,i18n/messages_zh_CN
 spring.messages.encoding=UTF-8
-spring.messages.cache-duration=0
+spring.messages.cache-duration=0
+
+
+#spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-origin-patterns=*
+#spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-methods=*
+#spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-headers=*
+#spring.cloud.gateway.globalcors.cors-configurations.[/**].allow-credentials=true
+#spring.cloud.gateway.globalcors.cors-configurations.[/**].max-age=3600
+
+
+
+# mall\u670D\u52A1\u8DEF\u7531\u914D\u7F6E
+spring.cloud.gateway.routes[0].id=mall
+spring.cloud.gateway.routes[0].uri=lb://mall
+spring.cloud.gateway.routes[0].predicates[0]=Path=/v3/api-docs/mall
+spring.cloud.gateway.routes[0].filters[0]=RewritePath=/v3/api-docs/mall, /v3/api-docs
+
+#spring.cloud.gateway.routes[0].predicates[0]=Path=/mall/**
+#spring.cloud.gateway.routes[0].filters[0]=RewritePath=/mall/(?<path>.*), /$\{path}
+
+# cif\u670D\u52A1\u8DEF\u7531\u914D\u7F6E
+spring.cloud.gateway.routes[1].id=cif
+spring.cloud.gateway.routes[1].uri=lb://cif
+spring.cloud.gateway.routes[1].predicates[0]=Path=/v3/api-docs/cif
+spring.cloud.gateway.routes[1].filters[0]=RewritePath=/v3/api-docs/cif, /v3/api-docs
+
+#
+## cif\u670D\u52A1\u8DEF\u7531\u914D\u7F6E
+#spring.cloud.gateway.routes[2].id=operating
+#spring.cloud.gateway.routes[2].uri=lb://operating
+#spring.cloud.gateway.routes[2].predicates[0]=Path=/v3/api-docs/operating
+#spring.cloud.gateway.routes[2].filters[0]=RewritePath=/v3/api-docs/operating, /v3/api-docs
+
+#spring.cloud.gateway.routes[1].id=cif
+#spring.cloud.gateway.routes[1].uri=lb://cif
+#spring.cloud.gateway.routes[1].predicates[0]=Path=/cif/**
+#spring.cloud.gateway.routes[1].filters[0]=StripPrefix=1