From 6260d394910f8b4ed38949738fc8c19a4ea35769 Mon Sep 17 00:00:00 2001 From: hyin Date: Fri, 28 Oct 2022 15:56:53 +0800 Subject: [PATCH 1/4] =?UTF-8?q?fix:Query=E5=8F=82=E6=95=B0=E4=B8=BA?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E6=97=B6=EF=BC=8C=E5=BA=94=E5=B1=95=E5=BC=80?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E5=B1=9E=E6=80=A7=E4=BD=9C=E4=B8=BAQuery?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/torna/api/open/SwaggerApi.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/server/server-api/src/main/java/cn/torna/api/open/SwaggerApi.java b/server/server-api/src/main/java/cn/torna/api/open/SwaggerApi.java index 02db61a2..e255b484 100644 --- a/server/server-api/src/main/java/cn/torna/api/open/SwaggerApi.java +++ b/server/server-api/src/main/java/cn/torna/api/open/SwaggerApi.java @@ -56,6 +56,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @author thc @@ -300,8 +301,8 @@ public class SwaggerApi { .deprecated(Optional.ofNullable(operation.getDeprecated()).orElse(false) ? "" : null) .orderIndex(threadLocal.get().getAndIncrement()) .headerParams(buildHeaderParamPushParams(operation)) - .pathParams(buildDocParamPushParams(operation, parameter -> Objects.equals("path", parameter.getIn()))) - .queryParams(buildDocParamPushParams(operation, parameter -> Objects.equals("query", parameter.getIn()))) + .pathParams(buildDocParamPushParams(openAPI, operation, parameter -> Objects.equals("path", parameter.getIn()))) + .queryParams(buildDocParamPushParams(openAPI, operation, parameter -> Objects.equals("query", parameter.getIn()))) .tag(CollectionUtils.isEmpty(operation.getTags()) ? "" : operation.getTags().get(0)) .build(); @@ -372,7 +373,7 @@ public class SwaggerApi { } } else { // 表单结构 - docParamPushParams = buildDocParamPushParams(operation, parameter -> "formData".equals(parameter.getIn())); + docParamPushParams = buildDocParamPushParams(openAPI, operation, parameter -> "formData".equals(parameter.getIn())); } return new RequestParamsWrapper(docParamPushParams, isRequestArray, contentType); } @@ -489,14 +490,14 @@ public class SwaggerApi { return enumInfoCreateParam; } - private static List buildDocParamPushParams(Operation operation, Predicate predicate) { + private static List buildDocParamPushParams(OpenAPI openAPI, Operation operation, Predicate predicate) { List parameters = operation.getParameters(); if (CollectionUtils.isEmpty(parameters)) { return null; } return parameters.stream() .filter(predicate) - .map(parameter -> { + .flatMap(parameter -> { DocParamPushParam param = DocParamPushParam.builder() .name(parameter.getName()) .type(getType(parameter)) @@ -507,16 +508,20 @@ public class SwaggerApi { .build(); Schema schema = parameter.getSchema(); if (schema != null) { + String $ref = schema.get$ref(); + String type = schema.getType(); // 如果是数组参数 - if ("array".equals(param.getType())) { + if ("array".equals(type)) { Schema items = schema.getItems(); String itemsType = items.getType(); - param.setType("array["+itemsType+"]"); + param.setType("array[" + itemsType + "]"); List list = items.getEnum(); setEnumDescription(list, param); + } else if ($ref != null) { + return buildObjectParam($ref, openAPI).stream(); } } - return param; + return Stream.of(param); }) .collect(Collectors.toList()); } -- Gitee From 3a86b0a515959625032507ef1aabd2f00351c581 Mon Sep 17 00:00:00 2001 From: hyin Date: Mon, 31 Oct 2022 09:48:53 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8DbuildObjectParam?= =?UTF-8?q?=E5=BE=AA=E7=8E=AF=E4=BE=9D=E8=B5=96=E5=A4=84=E7=90=86=E6=97=B6?= =?UTF-8?q?=E9=80=92=E5=BD=92=E6=AD=BB=E5=BE=AA=E7=8E=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/torna/api/open/SwaggerApi.java | 44 ++++++++++++------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/server/server-api/src/main/java/cn/torna/api/open/SwaggerApi.java b/server/server-api/src/main/java/cn/torna/api/open/SwaggerApi.java index e255b484..bdfb95a2 100644 --- a/server/server-api/src/main/java/cn/torna/api/open/SwaggerApi.java +++ b/server/server-api/src/main/java/cn/torna/api/open/SwaggerApi.java @@ -32,6 +32,7 @@ import io.swagger.v3.oas.models.parameters.RequestBody; import io.swagger.v3.oas.models.responses.ApiResponse; import io.swagger.v3.oas.models.responses.ApiResponses; import io.swagger.v3.oas.models.servers.Server; +import io.swagger.v3.parser.core.models.ParseOptions; import io.swagger.v3.parser.core.models.SwaggerParseResult; import lombok.AllArgsConstructor; import lombok.Data; @@ -43,15 +44,7 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import java.util.function.Predicate; @@ -359,9 +352,9 @@ public class SwaggerApi { isRequestArray = true; Schema items = schema.getItems(); $ref = items.get$ref(); - docParamPushParams = buildObjectParam($ref, openAPI); + docParamPushParams = buildObjectParam($ref, openAPI, new BuildObjectParamContext()); } else if ($ref != null) { - docParamPushParams = buildObjectParam($ref, openAPI); + docParamPushParams = buildObjectParam($ref, openAPI, new BuildObjectParamContext()); } } else if (key.contains("form")) { contentType = key.contains("multipart") ? "multipart/form-data" : "application/x-www-form-urlencoded"; @@ -398,9 +391,9 @@ public class SwaggerApi { isResponseArray = true; Schema items = schema.getItems(); $ref = items.get$ref(); - docParamPushParams = buildObjectParam($ref, openAPI); + docParamPushParams = buildObjectParam($ref, openAPI, new BuildObjectParamContext()); } else if ($ref != null) { - docParamPushParams = buildObjectParam($ref, openAPI); + docParamPushParams = buildObjectParam($ref, openAPI, new BuildObjectParamContext()); } } } @@ -409,8 +402,23 @@ public class SwaggerApi { return new ResponseParamsWrapper(docParamPushParams, isResponseArray); } + private static class BuildObjectParamContext { + private Set $refSets; - private static List buildObjectParam(String $ref, OpenAPI openAPI) { + public BuildObjectParamContext() { + $refSets = new HashSet<>(); + } + + public boolean add$ref(String $ref) { + return $refSets.add($ref); + } + } + + private static List buildObjectParam(String $ref, OpenAPI openAPI, BuildObjectParamContext context) { + // 防止树形对象死循环 + if (!context.add$ref($ref)) { + return null; + } JsonSchema jsonSchema = getJsonSchema($ref, openAPI); Map properties = jsonSchema.getProperties(); return Optional.ofNullable(properties) @@ -431,7 +439,8 @@ public class SwaggerApi { // 如果有子对象 if (value.containsKey("$ref")) { type = String.valueOf(value.getOrDefault("type", TYPE_OBJECT)); - children = buildObjectParam(String.valueOf(value.get("$ref")), openAPI); + final String child$ref = String.valueOf(value.get("$ref")); + children = buildObjectParam(child$ref, openAPI, context); } // 如果是枚举字段 if (value.containsKey(TYPE_ENUM)) { @@ -443,7 +452,8 @@ public class SwaggerApi { Map items = (Map)value.get("items"); Object itemRef = items.get("$ref"); if (itemRef != null) { - children = buildObjectParam(String.valueOf(itemRef), openAPI); + final String child$ref = String.valueOf(itemRef); + children = buildObjectParam(child$ref, openAPI, context); type = "array[object]"; } Object itemType = items.get("type"); @@ -518,7 +528,7 @@ public class SwaggerApi { List list = items.getEnum(); setEnumDescription(list, param); } else if ($ref != null) { - return buildObjectParam($ref, openAPI).stream(); + return buildObjectParam($ref, openAPI, new BuildObjectParamContext()).stream(); } } return Stream.of(param); -- Gitee From abca60edba52083e982b4db9110671989d2617f5 Mon Sep 17 00:00:00 2001 From: hyin Date: Mon, 31 Oct 2022 10:52:07 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8Didea=E5=BC=95?= =?UTF-8?q?=E5=85=A5*=E5=8F=B7=E9=97=AE=E9=A2=98=EF=BC=8C=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=E4=B8=BA=E7=B1=BB=E5=90=8D=E5=85=A8=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/torna/api/open/SwaggerApi.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/server/server-api/src/main/java/cn/torna/api/open/SwaggerApi.java b/server/server-api/src/main/java/cn/torna/api/open/SwaggerApi.java index bdfb95a2..67f639d6 100644 --- a/server/server-api/src/main/java/cn/torna/api/open/SwaggerApi.java +++ b/server/server-api/src/main/java/cn/torna/api/open/SwaggerApi.java @@ -44,7 +44,16 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import java.util.function.Predicate; -- Gitee From c529e8338b680eb129e3ea7d81cea9ca79b8aa06 Mon Sep 17 00:00:00 2001 From: hyin Date: Mon, 31 Oct 2022 15:19:27 +0800 Subject: [PATCH 4/4] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E5=AF=B9=E8=B1=A1?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E7=B1=BB=E5=9E=8B=E6=97=A0=E6=B3=95=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E5=AF=B9=E8=B1=A1=E5=B1=9E=E6=80=A7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/torna/api/open/SwaggerApi.java | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/server/server-api/src/main/java/cn/torna/api/open/SwaggerApi.java b/server/server-api/src/main/java/cn/torna/api/open/SwaggerApi.java index 67f639d6..31d4c931 100644 --- a/server/server-api/src/main/java/cn/torna/api/open/SwaggerApi.java +++ b/server/server-api/src/main/java/cn/torna/api/open/SwaggerApi.java @@ -72,6 +72,7 @@ public class SwaggerApi { private static final String TYPE_ENUM = "enum"; private static final String TYPE_OBJECT = "object"; public static final String TYPE_STRING = "string"; + public static final String TYPE_ARRAY = "array"; @Autowired private DocApi docApi; @@ -429,43 +430,44 @@ public class SwaggerApi { return null; } JsonSchema jsonSchema = getJsonSchema($ref, openAPI); - Map properties = jsonSchema.getProperties(); + final Map properties = jsonSchema.getSchema().getProperties(); return Optional.ofNullable(properties) .orElse(Collections.emptyMap()).entrySet() .stream() .map(entry -> { String name = entry.getKey(); - Map value = (Map) entry.getValue(); + Schema value = entry.getValue(); DocParamPushParam param = DocParamPushParam.builder() .name(name) - .required(Booleans.toValue(jsonSchema.getRequired(name) || Objects.equals("true", String.valueOf(value.getOrDefault("required", "false"))))) - .description(String.valueOf(value.getOrDefault("description", ""))) - .example(toString(value.get("example"))) + .required(Booleans.toValue(jsonSchema.getRequired(name) || Objects.equals("true", String.valueOf(value.getRequired())))) + .description(value.getDescription()) + .example(toString(value.getExample())) .maxLength(getMaxLength(jsonSchema.getSchema())) .build(); - String type = String.valueOf(value.getOrDefault("type", TYPE_OBJECT)); + String type = value.getType(); List children = null; // 如果有子对象 - if (value.containsKey("$ref")) { - type = String.valueOf(value.getOrDefault("type", TYPE_OBJECT)); - final String child$ref = String.valueOf(value.get("$ref")); + if (value.get$ref() != null) { + type = TYPE_OBJECT; + final String child$ref = value.get$ref(); children = buildObjectParam(child$ref, openAPI, context); } // 如果是枚举字段 - if (value.containsKey(TYPE_ENUM)) { - List list = (List) value.get(TYPE_ENUM); + if (value.getEnum() != null) { + type = TYPE_ENUM; + List list = value.getEnum(); setEnumDescription(list, param); } // list对象,List - if ("array".equals(type) && value.containsKey("items")) { - Map items = (Map)value.get("items"); - Object itemRef = items.get("$ref"); + if (TYPE_ARRAY.equals(type) && value.getItems() != null) { + Schema items = value.getItems(); + String itemRef = items.get$ref(); if (itemRef != null) { - final String child$ref = String.valueOf(itemRef); + final String child$ref = itemRef; children = buildObjectParam(child$ref, openAPI, context); type = "array[object]"; } - Object itemType = items.get("type"); + String itemType = items.getType(); if (itemType != null) { type = "array[" + itemType + "]"; } -- Gitee