From 88597ac137374d32b4c46e9ea3a4bcf084249615 Mon Sep 17 00:00:00 2001 From: John Niang Date: Tue, 16 May 2023 15:04:18 +0800 Subject: [PATCH] Fix the problem of inconsistent OpenAPI generation (#3954) #### What type of PR is this? /kind bug /area core /milestone 2.6.x #### What this PR does / why we need it: Sort properties before building. #### Which issue(s) this PR fixes: Fixes https://github.com/halo-dev/halo/issues/3944 #### Special notes for your reviewer: Try to generate api client several times. #### Does this PR introduce a user-facing change? ```release-note None ``` --- .../extension/router/QueryParamBuildUtil.java | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/api/src/main/java/run/halo/app/extension/router/QueryParamBuildUtil.java b/api/src/main/java/run/halo/app/extension/router/QueryParamBuildUtil.java index b3c47209f..2eb60075c 100644 --- a/api/src/main/java/run/halo/app/extension/router/QueryParamBuildUtil.java +++ b/api/src/main/java/run/halo/app/extension/router/QueryParamBuildUtil.java @@ -40,29 +40,33 @@ public final class QueryParamBuildUtil { var properties = (Map) resolvedSchema.schema.getProperties(); var requiredNames = defaultIfNull(resolvedSchema.schema.getRequired(), Collections.emptyList()); - properties.forEach((propName, propSchema) -> { - final var paramBuilder = parameterBuilder().in(ParameterIn.QUERY); - paramBuilder.name(propSchema.getName()) - .description(propSchema.getDescription()) - .style(ParameterStyle.FORM) - .explode(Explode.TRUE); - if (requiredNames.contains(propSchema.getName())) { - paramBuilder.required(true); - } + properties.keySet() + .stream() + .sorted() + .forEach(propName -> { + var propSchema = properties.get(propName); + final var paramBuilder = parameterBuilder().in(ParameterIn.QUERY); + paramBuilder.name(propSchema.getName()) + .description(propSchema.getDescription()) + .style(ParameterStyle.FORM) + .explode(Explode.TRUE); + if (requiredNames.contains(propSchema.getName())) { + paramBuilder.required(true); + } - if (propSchema instanceof ArraySchema arraySchema) { - paramBuilder.array(arraySchemaBuilder() - .uniqueItems(defaultIfNull(arraySchema.getUniqueItems(), false)) - .minItems(defaultIfNull(arraySchema.getMinItems(), 0)) - .maxItems(defaultIfNull(arraySchema.getMaxItems(), Integer.MAX_VALUE)) - .arraySchema(convertSchemaBuilder(arraySchema)) - .schema(convertSchemaBuilder(arraySchema.getItems())) - ); - } else { - paramBuilder.schema(convertSchemaBuilder(propSchema)); - } - operationBuilder.parameter(paramBuilder); - }); + if (propSchema instanceof ArraySchema arraySchema) { + paramBuilder.array(arraySchemaBuilder() + .uniqueItems(defaultIfNull(arraySchema.getUniqueItems(), false)) + .minItems(defaultIfNull(arraySchema.getMinItems(), 0)) + .maxItems(defaultIfNull(arraySchema.getMaxItems(), Integer.MAX_VALUE)) + .arraySchema(convertSchemaBuilder(arraySchema)) + .schema(convertSchemaBuilder(arraySchema.getItems())) + ); + } else { + paramBuilder.schema(convertSchemaBuilder(propSchema)); + } + operationBuilder.parameter(paramBuilder); + }); } private static org.springdoc.core.fn.builders.schema.Builder convertSchemaBuilder(