|
@@ -2,6 +2,8 @@ package com.vber.common.doc.handler;
|
|
|
|
|
|
|
|
import cn.hutool.core.io.IoUtil;
|
|
import cn.hutool.core.io.IoUtil;
|
|
|
import com.vber.common.core.utils.StreamUtils;
|
|
import com.vber.common.core.utils.StreamUtils;
|
|
|
|
|
+import com.vber.common.doc.core.resolver.JavadocResolver;
|
|
|
|
|
+
|
|
|
import io.swagger.v3.core.jackson.TypeNameResolver;
|
|
import io.swagger.v3.core.jackson.TypeNameResolver;
|
|
|
import io.swagger.v3.core.util.AnnotationsUtils;
|
|
import io.swagger.v3.core.util.AnnotationsUtils;
|
|
|
import io.swagger.v3.oas.annotations.tags.Tags;
|
|
import io.swagger.v3.oas.annotations.tags.Tags;
|
|
@@ -33,6 +35,8 @@ import java.util.stream.Stream;
|
|
|
/**
|
|
/**
|
|
|
* 自定义 openapi 处理器
|
|
* 自定义 openapi 处理器
|
|
|
* 对源码功能进行修改 增强使用
|
|
* 对源码功能进行修改 增强使用
|
|
|
|
|
+ *
|
|
|
|
|
+ * @author Iwb
|
|
|
*/
|
|
*/
|
|
|
@Slf4j
|
|
@Slf4j
|
|
|
@SuppressWarnings("all")
|
|
@SuppressWarnings("all")
|
|
@@ -83,6 +87,11 @@ public class OpenApiHandler extends OpenAPIService {
|
|
|
*/
|
|
*/
|
|
|
private final PropertyResolverUtils propertyResolverUtils;
|
|
private final PropertyResolverUtils propertyResolverUtils;
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Javadoc解析器接口
|
|
|
|
|
+ */
|
|
|
|
|
+ private final List<JavadocResolver> javadocResolvers;
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* The javadoc provider.
|
|
* The javadoc provider.
|
|
|
*/
|
|
*/
|
|
@@ -120,11 +129,13 @@ public class OpenApiHandler extends OpenAPIService {
|
|
|
* @param javadocProvider the javadoc provider
|
|
* @param javadocProvider the javadoc provider
|
|
|
*/
|
|
*/
|
|
|
public OpenApiHandler(Optional<OpenAPI> openAPI, SecurityService securityParser,
|
|
public OpenApiHandler(Optional<OpenAPI> openAPI, SecurityService securityParser,
|
|
|
- SpringDocConfigProperties springDocConfigProperties, PropertyResolverUtils propertyResolverUtils,
|
|
|
|
|
- Optional<List<OpenApiBuilderCustomizer>> openApiBuilderCustomizers,
|
|
|
|
|
- Optional<List<ServerBaseUrlCustomizer>> serverBaseUrlCustomizers,
|
|
|
|
|
- Optional<JavadocProvider> javadocProvider) {
|
|
|
|
|
- super(openAPI, securityParser, springDocConfigProperties, propertyResolverUtils, openApiBuilderCustomizers, serverBaseUrlCustomizers, javadocProvider);
|
|
|
|
|
|
|
+ SpringDocConfigProperties springDocConfigProperties, PropertyResolverUtils propertyResolverUtils,
|
|
|
|
|
+ Optional<List<OpenApiBuilderCustomizer>> openApiBuilderCustomizers,
|
|
|
|
|
+ Optional<List<ServerBaseUrlCustomizer>> serverBaseUrlCustomizers,
|
|
|
|
|
+ Optional<JavadocProvider> javadocProvider,
|
|
|
|
|
+ List<JavadocResolver> javadocResolvers) {
|
|
|
|
|
+ super(openAPI, securityParser, springDocConfigProperties, propertyResolverUtils, openApiBuilderCustomizers,
|
|
|
|
|
+ serverBaseUrlCustomizers, javadocProvider);
|
|
|
if (openAPI.isPresent()) {
|
|
if (openAPI.isPresent()) {
|
|
|
this.openAPI = openAPI.get();
|
|
this.openAPI = openAPI.get();
|
|
|
if (this.openAPI.getComponents() == null)
|
|
if (this.openAPI.getComponents() == null)
|
|
@@ -140,6 +151,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.javadocResolvers = javadocResolvers == null ? new ArrayList<>() : javadocResolvers;
|
|
|
if (springDocConfigProperties.isUseFqn())
|
|
if (springDocConfigProperties.isUseFqn())
|
|
|
TypeNameResolver.std.setUseFqn(true);
|
|
TypeNameResolver.std.setUseFqn(true);
|
|
|
}
|
|
}
|
|
@@ -159,7 +171,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);
|
|
@@ -179,11 +191,10 @@ public class OpenApiHandler extends OpenAPIService {
|
|
|
|
|
|
|
|
if (isAutoTagClasses(operation)) {
|
|
if (isAutoTagClasses(operation)) {
|
|
|
|
|
|
|
|
-
|
|
|
|
|
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<>());
|
|
@@ -204,7 +215,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));
|
|
@@ -220,16 +231,34 @@ 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);
|
|
|
|
|
+ }
|
|
|
|
|
+ // 调用解析器提取JavaDoc中的权限信息
|
|
|
|
|
+ if (javadocResolvers != null && !javadocResolvers.isEmpty()) {
|
|
|
|
|
+ for (JavadocResolver resolver : javadocResolvers) {
|
|
|
|
|
+ String desc = resolver.resolve(handlerMethod, operation);
|
|
|
|
|
+ description = description + desc;
|
|
|
|
|
+ }
|
|
|
|
|
+ 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);
|
|
|
Set<io.swagger.v3.oas.annotations.tags.Tag> methodTags = tagsSet.stream()
|
|
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));
|
|
|
|
|
|
|
+ methodTags.addAll(
|
|
|
|
|
+ AnnotatedElementUtils.findAllMergedAnnotations(method, io.swagger.v3.oas.annotations.tags.Tag.class));
|
|
|
if (!CollectionUtils.isEmpty(methodTags)) {
|
|
if (!CollectionUtils.isEmpty(methodTags)) {
|
|
|
tagsStr.addAll(StreamUtils.toSet(methodTags, tag -> propertyResolverUtils.resolve(tag.name(), locale)));
|
|
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);
|
|
@@ -237,8 +266,9 @@ public class OpenApiHandler extends OpenAPIService {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- 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 -> {
|