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