diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java index 81657e4cbb..c8ef84ed9e 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java @@ -11,7 +11,9 @@ import io.swagger.v3.oas.models.media.ObjectSchema; import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.parameters.Parameter; +import io.swagger.v3.oas.models.parameters.RequestBody; import io.swagger.v3.oas.models.responses.ApiResponse; +import io.swagger.v3.parser.models.RefFormat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,6 +27,10 @@ import java.util.Set; import java.util.stream.Collectors; +import static io.swagger.v3.parser.util.RefUtils.computeDefinitionName; +import static io.swagger.v3.parser.util.RefUtils.computeRefFormat; +import static io.swagger.v3.parser.util.RefUtils.isAnExternalRefFormat; + public class ResolverFully { private static final Logger LOGGER = LoggerFactory.getLogger(ResolverFully.class); @@ -41,10 +47,17 @@ public ResolverFully(boolean aggregateCombinators) { private Map schemas; private Map resolvedModels = new HashMap<>(); private Map examples; - + private Map requestBodies; public void resolveFully(OpenAPI openAPI) { + if (openAPI.getComponents() != null && openAPI.getComponents().getRequestBodies() != null) { + requestBodies = openAPI.getComponents().getRequestBodies(); + if (requestBodies == null) { + requestBodies = new HashMap<>(); + } + } + if (openAPI.getComponents() != null && openAPI.getComponents().getSchemas() != null) { schemas = openAPI.getComponents().getSchemas(); if (schemas == null) { @@ -108,13 +121,17 @@ public void resolvePath(PathItem pathItem){ } } - if (op.getRequestBody() != null && op.getRequestBody().getContent() != null){ - Map content = op.getRequestBody().getContent(); - for (String key: content.keySet()){ - if (content.get(key) != null && content.get(key).getSchema() != null ){ - Schema resolved = resolveSchema(content.get(key).getSchema()); - if (resolved != null) { - content.get(key).setSchema(resolved); + RequestBody refRequestBody = op.getRequestBody(); + if (refRequestBody != null){ + RequestBody requestBody = refRequestBody.get$ref() != null ? resolveRequestBody(refRequestBody) : refRequestBody; + if (requestBody.getContent() != null) { + Map content = requestBody.getContent(); + for (String key : content.keySet()) { + if (content.get(key) != null && content.get(key).getSchema() != null) { + Schema resolved = resolveSchema(content.get(key).getSchema()); + if (resolved != null) { + content.get(key).setSchema(resolved); + } } } } @@ -142,6 +159,17 @@ public void resolvePath(PathItem pathItem){ } } + public RequestBody resolveRequestBody(RequestBody requestBody){ + RefFormat refFormat = computeRefFormat(requestBody.get$ref()); + String $ref = requestBody.get$ref(); + if (!isAnExternalRefFormat(refFormat)){ + if (requestBodies != null && !requestBodies.isEmpty()) { + String referenceKey = computeDefinitionName($ref); + return requestBodies.getOrDefault(referenceKey, requestBody); + } + } + return requestBody; + } public Schema resolveSchema(Schema schema) { if(schema.get$ref() != null) {