From d22d2cb708c6387e01c8b7456b4dd4d5ee8759f8 Mon Sep 17 00:00:00 2001
From: ageer <ageerle@163.com>
Date: 星期六, 03 五月 2025 14:31:20 +0800
Subject: [PATCH] fix(接口文档): 修复接口文档/v3/api-docs无法正常访问

---
 ruoyi-common/ruoyi-common-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports |    2 
 ruoyi-common/ruoyi-common-doc/src/main/java/org/ruoyi/common/doc/handler/OpenApiHandler.java                                      |   27 +++++++------
 ruoyi-admin/src/main/resources/static/favicon.ico                                                                                 |    0 
 ruoyi-common/ruoyi-common-doc/src/main/java/org/ruoyi/common/doc/config/SpringDocConfig.java                                      |   22 +++++-----
 pom.xml                                                                                                                           |    2 
 ruoyi-admin/src/main/resources/application.yml                                                                                    |   35 ++++++++---------
 ruoyi-common/ruoyi-common-doc/src/main/java/org/ruoyi/common/doc/config/properties/SpringDocProperties.java                       |    4 +-
 7 files changed, 46 insertions(+), 46 deletions(-)

diff --git a/pom.xml b/pom.xml
index fada46e..f0041fc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,7 +20,7 @@
         <java.version>17</java.version>
         <mysql.version>8.0.33</mysql.version>
         <mybatis.version>3.5.16</mybatis.version>
-        <springdoc.version>2.1.0</springdoc.version>
+        <springdoc.version>2.8.5</springdoc.version>
         <therapi-javadoc.version>0.15.0</therapi-javadoc.version>
         <poi.version>5.2.3</poi.version>
         <easyexcel.version>3.2.1</easyexcel.version>
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index b30c848..490efb2 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -215,20 +215,25 @@
   publicKey:
   privateKey:
 
-# Swagger閰嶇疆
-swagger:
+springdoc:
+  api-docs:
+    # 鏄惁寮�鍚帴鍙f枃妗�
+    enabled: true
+  #  swagger-ui:
+  #    # 鎸佷箙鍖栬璇佹暟鎹�
+  #    persistAuthorization: true
   info:
     # 鏍囬
-    title: '鏍囬锛�${ruoyi.name}澶氱鎴风鐞嗙郴缁焈鎺ュ彛鏂囨。'
+    title: '鏍囬锛歊uoYi-Vue-Plus澶氱鎴风鐞嗙郴缁焈鎺ュ彛鏂囨。'
     # 鎻忚堪
     description: '鎻忚堪锛氱敤浜庣鐞嗛泦鍥㈡棗涓嬪叕鍙哥殑浜哄憳淇℃伅,鍏蜂綋鍖呮嫭XXX,XXX妯″潡...'
     # 鐗堟湰
     version: '鐗堟湰鍙�: ${ruoyi.version}'
     # 浣滆�呬俊鎭�
     contact:
-      name: ageerle
-      email: ageerle@163.com
-      url: https://gitee.com/ageerle/ruoyi-ai
+      name: Lion Li
+      email: crazylionli@163.com
+      url: https://gitee.com/dromara/RuoYi-Vue-Plus
   components:
     # 閴存潈鏂瑰紡閰嶇疆
     security-schemes:
@@ -236,24 +241,18 @@
         type: APIKEY
         in: HEADER
         name: ${sa-token.token-name}
-
-springdoc:
-  api-docs:
-    # 鏄惁寮�鍚帴鍙f枃妗�
-    enabled: true
-  swagger-ui:
-    # 鎸佷箙鍖栬璇佹暟鎹�
-    persistAuthorization: true
   #杩欓噷瀹氫箟浜嗕袱涓垎缁勶紝鍙畾涔夊涓紝涔熷彲浠ヤ笉瀹氫箟
   group-configs:
     - group: 1.婕旂ず妯″潡
-      packages-to-scan: org.ruoyi.demo
+      packages-to-scan: org.dromara.demo
     - group: 2.閫氱敤妯″潡
-      packages-to-scan: org.ruoyi.web
+      packages-to-scan: org.dromara.web
     - group: 3.绯荤粺妯″潡
-      packages-to-scan: org.ruoyi.system
+      packages-to-scan: org.dromara.system
     - group: 4.浠g爜鐢熸垚妯″潡
-      packages-to-scan: org.ruoyi.generator
+      packages-to-scan: org.dromara.generator
+    - group: 5.宸ヤ綔娴佹ā鍧�
+      packages-to-scan: org.dromara.workflow
 
 # 闃叉XSS鏀诲嚮
 xss:
diff --git a/ruoyi-admin/src/main/resources/static/favicon.ico b/ruoyi-admin/src/main/resources/static/favicon.ico
new file mode 100644
index 0000000..5db8e1d
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/static/favicon.ico
Binary files differ
diff --git a/ruoyi-common/ruoyi-common-doc/src/main/java/org/ruoyi/common/doc/config/SwaggerConfig.java b/ruoyi-common/ruoyi-common-doc/src/main/java/org/ruoyi/common/doc/config/SpringDocConfig.java
similarity index 86%
rename from ruoyi-common/ruoyi-common-doc/src/main/java/org/ruoyi/common/doc/config/SwaggerConfig.java
rename to ruoyi-common/ruoyi-common-doc/src/main/java/org/ruoyi/common/doc/config/SpringDocConfig.java
index fe95cbc..9361297 100644
--- a/ruoyi-common/ruoyi-common-doc/src/main/java/org/ruoyi/common/doc/config/SwaggerConfig.java
+++ b/ruoyi-common/ruoyi-common-doc/src/main/java/org/ruoyi/common/doc/config/SpringDocConfig.java
@@ -6,7 +6,7 @@
 import io.swagger.v3.oas.models.security.SecurityRequirement;
 import lombok.RequiredArgsConstructor;
 import org.ruoyi.common.core.utils.StringUtils;
-import org.ruoyi.common.doc.config.properties.SwaggerProperties;
+import org.ruoyi.common.doc.config.properties.SpringDocProperties;
 import org.ruoyi.common.doc.handler.OpenApiHandler;
 import org.springdoc.core.configuration.SpringDocConfiguration;
 import org.springdoc.core.customizers.OpenApiBuilderCustomizer;
@@ -36,26 +36,26 @@
  */
 @RequiredArgsConstructor
 @AutoConfiguration(before = SpringDocConfiguration.class)
-@EnableConfigurationProperties(SwaggerProperties.class)
+@EnableConfigurationProperties(SpringDocProperties.class)
 @ConditionalOnProperty(name = "springdoc.api-docs.enabled", havingValue = "true", matchIfMissing = true)
-public class SwaggerConfig {
+public class SpringDocConfig {
 
     private final ServerProperties serverProperties;
 
     @Bean
     @ConditionalOnMissingBean(OpenAPI.class)
-    public OpenAPI openApi(SwaggerProperties swaggerProperties) {
+    public OpenAPI openApi(SpringDocProperties properties) {
         OpenAPI openApi = new OpenAPI();
         // 鏂囨。鍩烘湰淇℃伅
-        SwaggerProperties.InfoProperties infoProperties = swaggerProperties.getInfo();
+        SpringDocProperties.InfoProperties infoProperties = properties.getInfo();
         Info info = convertInfo(infoProperties);
         openApi.info(info);
         // 鎵╁睍鏂囨。淇℃伅
-        openApi.externalDocs(swaggerProperties.getExternalDocs());
-        openApi.tags(swaggerProperties.getTags());
-        openApi.paths(swaggerProperties.getPaths());
-        openApi.components(swaggerProperties.getComponents());
-        Set<String> keySet = swaggerProperties.getComponents().getSecuritySchemes().keySet();
+        openApi.externalDocs(properties.getExternalDocs());
+        openApi.tags(properties.getTags());
+        openApi.paths(properties.getPaths());
+        openApi.components(properties.getComponents());
+        Set<String> keySet = properties.getComponents().getSecuritySchemes().keySet();
         List<SecurityRequirement> list = new ArrayList<>();
         SecurityRequirement securityRequirement = new SecurityRequirement();
         keySet.forEach(securityRequirement::addList);
@@ -65,7 +65,7 @@
         return openApi;
     }
 
-    private Info convertInfo(SwaggerProperties.InfoProperties infoProperties) {
+    private Info convertInfo(SpringDocProperties.InfoProperties infoProperties) {
         Info info = new Info();
         info.setTitle(infoProperties.getTitle());
         info.setDescription(infoProperties.getDescription());
diff --git a/ruoyi-common/ruoyi-common-doc/src/main/java/org/ruoyi/common/doc/config/properties/SwaggerProperties.java b/ruoyi-common/ruoyi-common-doc/src/main/java/org/ruoyi/common/doc/config/properties/SpringDocProperties.java
similarity index 95%
rename from ruoyi-common/ruoyi-common-doc/src/main/java/org/ruoyi/common/doc/config/properties/SwaggerProperties.java
rename to ruoyi-common/ruoyi-common-doc/src/main/java/org/ruoyi/common/doc/config/properties/SpringDocProperties.java
index 057c70f..66f80c7 100644
--- a/ruoyi-common/ruoyi-common-doc/src/main/java/org/ruoyi/common/doc/config/properties/SwaggerProperties.java
+++ b/ruoyi-common/ruoyi-common-doc/src/main/java/org/ruoyi/common/doc/config/properties/SpringDocProperties.java
@@ -18,8 +18,8 @@
  * @author Lion Li
  */
 @Data
-@ConfigurationProperties(prefix = "swagger")
-public class SwaggerProperties {
+@ConfigurationProperties(prefix = "springdoc")
+public class SpringDocProperties {
 
     /**
      * 鏂囨。鍩烘湰淇℃伅
diff --git a/ruoyi-common/ruoyi-common-doc/src/main/java/org/ruoyi/common/doc/handler/OpenApiHandler.java b/ruoyi-common/ruoyi-common-doc/src/main/java/org/ruoyi/common/doc/handler/OpenApiHandler.java
index 34aff59..48dd1ac 100644
--- a/ruoyi-common/ruoyi-common-doc/src/main/java/org/ruoyi/common/doc/handler/OpenApiHandler.java
+++ b/ruoyi-common/ruoyi-common-doc/src/main/java/org/ruoyi/common/doc/handler/OpenApiHandler.java
@@ -11,6 +11,7 @@
 import io.swagger.v3.oas.models.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.ruoyi.common.core.utils.StreamUtils;
 import org.springdoc.core.customizers.OpenApiBuilderCustomizer;
 import org.springdoc.core.customizers.ServerBaseUrlCustomizer;
 import org.springdoc.core.properties.SpringDocConfigProperties;
@@ -154,11 +155,11 @@
 
         if (!CollectionUtils.isEmpty(tagsStr))
             tagsStr = tagsStr.stream()
-                .map(str -> propertyResolverUtils.resolve(str, locale))
-                .collect(Collectors.toSet());
+                    .map(str -> propertyResolverUtils.resolve(str, locale))
+                    .collect(Collectors.toSet());
 
         if (springdocTags.containsKey(handlerMethod)) {
-            Tag tag = springdocTags.get(handlerMethod);
+            io.swagger.v3.oas.models.tags.Tag tag = springdocTags.get(handlerMethod);
             tagsStr.add(tag.getName());
             if (openAPI.getTags() == null || !openAPI.getTags().contains(tag)) {
                 openAPI.addTagsItem(tag);
@@ -182,7 +183,7 @@
             if (javadocProvider.isPresent()) {
                 String description = javadocProvider.get().getClassJavadoc(handlerMethod.getBeanType());
                 if (StringUtils.isNotBlank(description)) {
-                    Tag tag = new Tag();
+                    io.swagger.v3.oas.models.tags.Tag tag = new io.swagger.v3.oas.models.tags.Tag();
 
                     // 鑷畾涔夐儴鍒� 淇敼浣跨敤java娉ㄩ噴褰搕ag鍚�
                     List<String> list = IoUtil.readLines(new StringReader(description), new ArrayList<>());
@@ -203,7 +204,7 @@
 
         if (!CollectionUtils.isEmpty(tags)) {
             // Existing tags
-            List<Tag> openApiTags = openAPI.getTags();
+            List<io.swagger.v3.oas.models.tags.Tag> openApiTags = openAPI.getTags();
             if (!CollectionUtils.isEmpty(openApiTags))
                 tags.addAll(openApiTags);
             openAPI.setTags(new ArrayList<>(tags));
@@ -211,7 +212,7 @@
 
         // Handle SecurityRequirement at operation level
         io.swagger.v3.oas.annotations.security.SecurityRequirement[] securityRequirements = securityParser
-            .getSecurityRequirements(handlerMethod);
+                .getSecurityRequirements(handlerMethod);
         if (securityRequirements != null) {
             if (securityRequirements.length == 0)
                 operation.setSecurity(Collections.emptyList());
@@ -222,23 +223,23 @@
         return operation;
     }
 
-    private void buildTagsFromMethod(Method method, Set<Tag> tags, Set<String> tagsStr, Locale locale) {
+    private void buildTagsFromMethod(Method method, Set<io.swagger.v3.oas.models.tags.Tag> tags, Set<String> tagsStr, Locale locale) {
         // method tags
         Set<Tags> tagsSet = AnnotatedElementUtils
-            .findAllMergedAnnotations(method, Tags.class);
+                .findAllMergedAnnotations(method, Tags.class);
         Set<io.swagger.v3.oas.annotations.tags.Tag> methodTags = tagsSet.stream()
-            .flatMap(x -> Stream.of(x.value())).collect(Collectors.toSet());
+                .flatMap(x -> Stream.of(x.value())).collect(Collectors.toSet());
         methodTags.addAll(AnnotatedElementUtils.findAllMergedAnnotations(method, io.swagger.v3.oas.annotations.tags.Tag.class));
         if (!CollectionUtils.isEmpty(methodTags)) {
-            tagsStr.addAll(methodTags.stream().map(tag -> propertyResolverUtils.resolve(tag.name(), locale)).collect(Collectors.toSet()));
+            tagsStr.addAll(StreamUtils.toSet(methodTags, tag -> propertyResolverUtils.resolve(tag.name(), locale)));
             List<io.swagger.v3.oas.annotations.tags.Tag> allTags = new ArrayList<>(methodTags);
             addTags(allTags, tags, locale);
         }
     }
 
-    private void addTags(List<io.swagger.v3.oas.annotations.tags.Tag> sourceTags, Set<Tag> tags, Locale locale) {
-        Optional<Set<Tag>> optionalTagSet = AnnotationsUtils
-            .getTags(sourceTags.toArray(new io.swagger.v3.oas.annotations.tags.Tag[0]), true);
+    private void addTags(List<io.swagger.v3.oas.annotations.tags.Tag> sourceTags, Set<io.swagger.v3.oas.models.tags.Tag> tags, Locale locale) {
+        Optional<Set<io.swagger.v3.oas.models.tags.Tag>> optionalTagSet = AnnotationsUtils
+                .getTags(sourceTags.toArray(new io.swagger.v3.oas.annotations.tags.Tag[0]), true);
         optionalTagSet.ifPresent(tagsSet -> {
             tagsSet.forEach(tag -> {
                 tag.name(propertyResolverUtils.resolve(tag.getName(), locale));
diff --git a/ruoyi-common/ruoyi-common-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index 97e76b8..14b745e 100644
--- a/ruoyi-common/ruoyi-common-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/ruoyi-common/ruoyi-common-doc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1 +1 @@
-org.ruoyi.common.doc.config.SwaggerConfig
+org.ruoyi.common.doc.config.SpringDocConfig

--
Gitblit v1.9.3