|
@@ -11,6 +11,9 @@ import io.swagger.v3.oas.models.Paths;
|
|
|
import io.swagger.v3.oas.models.tags.Tag;
|
|
import io.swagger.v3.oas.models.tags.Tag;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
+import org.dromara.common.core.utils.StreamUtils;
|
|
|
|
|
+import org.dromara.common.doc.core.enhancer.SaTokenMetadataResolver;
|
|
|
|
|
+import org.dromara.common.doc.core.model.SaTokenSecurityMetadata;
|
|
|
import org.springdoc.core.customizers.OpenApiBuilderCustomizer;
|
|
import org.springdoc.core.customizers.OpenApiBuilderCustomizer;
|
|
|
import org.springdoc.core.customizers.ServerBaseUrlCustomizer;
|
|
import org.springdoc.core.customizers.ServerBaseUrlCustomizer;
|
|
|
import org.springdoc.core.properties.SpringDocConfigProperties;
|
|
import org.springdoc.core.properties.SpringDocConfigProperties;
|
|
@@ -82,6 +85,11 @@ public class OpenApiHandler extends OpenAPIService {
|
|
|
*/
|
|
*/
|
|
|
private final PropertyResolverUtils propertyResolverUtils;
|
|
private final PropertyResolverUtils propertyResolverUtils;
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 权限元数据解析器接口
|
|
|
|
|
+ */
|
|
|
|
|
+ private final SaTokenMetadataResolver saTokenJavadocResolver;
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* The javadoc provider.
|
|
* The javadoc provider.
|
|
|
*/
|
|
*/
|
|
@@ -122,7 +130,8 @@ public class OpenApiHandler extends OpenAPIService {
|
|
|
SpringDocConfigProperties springDocConfigProperties, PropertyResolverUtils propertyResolverUtils,
|
|
SpringDocConfigProperties springDocConfigProperties, PropertyResolverUtils propertyResolverUtils,
|
|
|
Optional<List<OpenApiBuilderCustomizer>> openApiBuilderCustomizers,
|
|
Optional<List<OpenApiBuilderCustomizer>> openApiBuilderCustomizers,
|
|
|
Optional<List<ServerBaseUrlCustomizer>> serverBaseUrlCustomizers,
|
|
Optional<List<ServerBaseUrlCustomizer>> serverBaseUrlCustomizers,
|
|
|
- Optional<JavadocProvider> javadocProvider) {
|
|
|
|
|
|
|
+ Optional<JavadocProvider> javadocProvider,
|
|
|
|
|
+ SaTokenMetadataResolver saTokenJavadocResolver) {
|
|
|
super(openAPI, securityParser, springDocConfigProperties, propertyResolverUtils, openApiBuilderCustomizers, serverBaseUrlCustomizers, javadocProvider);
|
|
super(openAPI, securityParser, springDocConfigProperties, propertyResolverUtils, openApiBuilderCustomizers, serverBaseUrlCustomizers, javadocProvider);
|
|
|
if (openAPI.isPresent()) {
|
|
if (openAPI.isPresent()) {
|
|
|
this.openAPI = openAPI.get();
|
|
this.openAPI = openAPI.get();
|
|
@@ -139,6 +148,7 @@ public class OpenApiHandler extends OpenAPIService {
|
|
|
this.openApiBuilderCustomisers = openApiBuilderCustomizers;
|
|
this.openApiBuilderCustomisers = openApiBuilderCustomizers;
|
|
|
this.serverBaseUrlCustomizers = serverBaseUrlCustomizers;
|
|
this.serverBaseUrlCustomizers = serverBaseUrlCustomizers;
|
|
|
this.javadocProvider = javadocProvider;
|
|
this.javadocProvider = javadocProvider;
|
|
|
|
|
+ this.saTokenJavadocResolver = saTokenJavadocResolver;
|
|
|
if (springDocConfigProperties.isUseFqn())
|
|
if (springDocConfigProperties.isUseFqn())
|
|
|
TypeNameResolver.std.setUseFqn(true);
|
|
TypeNameResolver.std.setUseFqn(true);
|
|
|
}
|
|
}
|
|
@@ -158,7 +168,7 @@ public class OpenApiHandler extends OpenAPIService {
|
|
|
.collect(Collectors.toSet());
|
|
.collect(Collectors.toSet());
|
|
|
|
|
|
|
|
if (springdocTags.containsKey(handlerMethod)) {
|
|
if (springdocTags.containsKey(handlerMethod)) {
|
|
|
- Tag tag = springdocTags.get(handlerMethod);
|
|
|
|
|
|
|
+ io.swagger.v3.oas.models.tags.Tag tag = springdocTags.get(handlerMethod);
|
|
|
tagsStr.add(tag.getName());
|
|
tagsStr.add(tag.getName());
|
|
|
if (openAPI.getTags() == null || !openAPI.getTags().contains(tag)) {
|
|
if (openAPI.getTags() == null || !openAPI.getTags().contains(tag)) {
|
|
|
openAPI.addTagsItem(tag);
|
|
openAPI.addTagsItem(tag);
|
|
@@ -182,7 +192,7 @@ public class OpenApiHandler extends OpenAPIService {
|
|
|
if (javadocProvider.isPresent()) {
|
|
if (javadocProvider.isPresent()) {
|
|
|
String description = javadocProvider.get().getClassJavadoc(handlerMethod.getBeanType());
|
|
String description = javadocProvider.get().getClassJavadoc(handlerMethod.getBeanType());
|
|
|
if (StringUtils.isNotBlank(description)) {
|
|
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注释当tag名
|
|
// 自定义部分 修改使用java注释当tag名
|
|
|
List<String> list = IoUtil.readLines(new StringReader(description), new ArrayList<>());
|
|
List<String> list = IoUtil.readLines(new StringReader(description), new ArrayList<>());
|
|
@@ -203,7 +213,7 @@ public class OpenApiHandler extends OpenAPIService {
|
|
|
|
|
|
|
|
if (!CollectionUtils.isEmpty(tags)) {
|
|
if (!CollectionUtils.isEmpty(tags)) {
|
|
|
// Existing tags
|
|
// Existing tags
|
|
|
- List<Tag> openApiTags = openAPI.getTags();
|
|
|
|
|
|
|
+ List<io.swagger.v3.oas.models.tags.Tag> openApiTags = openAPI.getTags();
|
|
|
if (!CollectionUtils.isEmpty(openApiTags))
|
|
if (!CollectionUtils.isEmpty(openApiTags))
|
|
|
tags.addAll(openApiTags);
|
|
tags.addAll(openApiTags);
|
|
|
openAPI.setTags(new ArrayList<>(tags));
|
|
openAPI.setTags(new ArrayList<>(tags));
|
|
@@ -219,10 +229,28 @@ public class OpenApiHandler extends OpenAPIService {
|
|
|
securityParser.buildSecurityRequirement(securityRequirements, operation);
|
|
securityParser.buildSecurityRequirement(securityRequirements, operation);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ if (javadocProvider.isPresent()) {
|
|
|
|
|
+ String description = javadocProvider.get().getMethodJavadocDescription(handlerMethod.getMethod());
|
|
|
|
|
+ String summary = javadocProvider.get().getFirstSentence(description);
|
|
|
|
|
+ if (StringUtils.isNotBlank(description)){
|
|
|
|
|
+ operation.setSummary(summary);
|
|
|
|
|
+ }
|
|
|
|
|
+ // 调用SaToken解析器提取JavaDoc中的权限信息
|
|
|
|
|
+ if (saTokenJavadocResolver.supports(handlerMethod)) {
|
|
|
|
|
+ SaTokenSecurityMetadata metadata = new SaTokenSecurityMetadata();
|
|
|
|
|
+ saTokenJavadocResolver.resolve(handlerMethod, operation, metadata);
|
|
|
|
|
+ String markdownString = metadata.toMarkdownString();
|
|
|
|
|
+ if (StringUtils.isNotBlank(markdownString)) {
|
|
|
|
|
+ description = description + markdownString;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ operation.setDescription(description);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
return operation;
|
|
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
|
|
// method tags
|
|
|
Set<Tags> tagsSet = AnnotatedElementUtils
|
|
Set<Tags> tagsSet = AnnotatedElementUtils
|
|
|
.findAllMergedAnnotations(method, Tags.class);
|
|
.findAllMergedAnnotations(method, Tags.class);
|
|
@@ -230,14 +258,14 @@ public class OpenApiHandler extends OpenAPIService {
|
|
|
.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));
|
|
methodTags.addAll(AnnotatedElementUtils.findAllMergedAnnotations(method, io.swagger.v3.oas.annotations.tags.Tag.class));
|
|
|
if (!CollectionUtils.isEmpty(methodTags)) {
|
|
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);
|
|
List<io.swagger.v3.oas.annotations.tags.Tag> allTags = new ArrayList<>(methodTags);
|
|
|
addTags(allTags, tags, locale);
|
|
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
|
|
|
|
|
|
|
+ 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);
|
|
.getTags(sourceTags.toArray(new io.swagger.v3.oas.annotations.tags.Tag[0]), true);
|
|
|
optionalTagSet.ifPresent(tagsSet -> {
|
|
optionalTagSet.ifPresent(tagsSet -> {
|
|
|
tagsSet.forEach(tag -> {
|
|
tagsSet.forEach(tag -> {
|