diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/ResolverCache.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/ResolverCache.java index f109157fa5..e24d849975 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/ResolverCache.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/ResolverCache.java @@ -154,38 +154,38 @@ else if(rootPath != null) { private Object loadInternalRef(String ref) { Object result = null; - if(ref.startsWith("#/components/schemas")) { - result = getFromMap(ref, openApi.getComponents().getSchemas(), SCHEMAS_PATTERN); - } - else if(ref.startsWith("#/components/requestBodies")) { - result = getFromMap(ref, openApi.getComponents().getRequestBodies(), REQUEST_BODIES_PATTERN); - } - else if(ref.startsWith("#/components/examples")) { - result = getFromMap(ref, openApi.getComponents().getExamples(), EXAMPLES_PATTERN); - } - else if(ref.startsWith("#/components/responses")) { - result = getFromMap(ref, openApi.getComponents().getResponses(), RESPONSES_PATTERN); - } - else if(ref.startsWith("#/components/parameters")) { - result = getFromMap(ref, openApi.getComponents().getParameters(), PARAMETERS_PATTERN); - } - else if(ref.startsWith("#/components/links")) { - result = getFromMap(ref, openApi.getComponents().getLinks(), LINKS_PATTERN); - } - else if(ref.startsWith("#/components/headers")) { - result = getFromMap(ref, openApi.getComponents().getHeaders(), HEADERS_PATTERN); - } - else if(ref.startsWith("#/components/callbacks")) { - result = getFromMap(ref, openApi.getComponents().getCallbacks(), CALLBACKS_PATTERN); - } - else if(ref.startsWith("#/components/securitySchemes")) { - result = getFromMap(ref, openApi.getComponents().getSecuritySchemes(), SECURITY_SCHEMES); - } - else if(ref.startsWith("#/paths")) { + if (ref.startsWith("#/paths")) { result = getFromMap(ref, openApi.getPaths(), PATHS_PATTERN); + } else if (openApi.getComponents() != null){ + if(ref.startsWith("#/components/schemas")) { + result = getFromMap(ref, openApi.getComponents().getSchemas(), SCHEMAS_PATTERN); + } + else if(ref.startsWith("#/components/requestBodies")) { + result = getFromMap(ref, openApi.getComponents().getRequestBodies(), REQUEST_BODIES_PATTERN); + } + else if(ref.startsWith("#/components/examples")) { + result = getFromMap(ref, openApi.getComponents().getExamples(), EXAMPLES_PATTERN); + } + else if(ref.startsWith("#/components/responses")) { + result = getFromMap(ref, openApi.getComponents().getResponses(), RESPONSES_PATTERN); + } + else if(ref.startsWith("#/components/parameters")) { + result = getFromMap(ref, openApi.getComponents().getParameters(), PARAMETERS_PATTERN); + } + else if(ref.startsWith("#/components/links")) { + result = getFromMap(ref, openApi.getComponents().getLinks(), LINKS_PATTERN); + } + else if(ref.startsWith("#/components/headers")) { + result = getFromMap(ref, openApi.getComponents().getHeaders(), HEADERS_PATTERN); + } + else if(ref.startsWith("#/components/callbacks")) { + result = getFromMap(ref, openApi.getComponents().getCallbacks(), CALLBACKS_PATTERN); + } + else if(ref.startsWith("#/components/securitySchemes")) { + result = getFromMap(ref, openApi.getComponents().getSecuritySchemes(), SECURITY_SCHEMES); + } } - return result; } diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/ExternalRefProcessor.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/ExternalRefProcessor.java index 2e51151d1d..8f9edfd323 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/ExternalRefProcessor.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/ExternalRefProcessor.java @@ -1,6 +1,7 @@ package io.swagger.v3.parser.processors; +import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.callbacks.Callback; import io.swagger.v3.oas.models.examples.Example; @@ -51,6 +52,9 @@ public String processRefToExternalSchema(String $ref, RefFormat refFormat) { } String newRef; + if (openAPI.getComponents() == null) { + openAPI.setComponents(new Components()); + } Map schemas = openAPI.getComponents().getSchemas(); if (schemas == null) { @@ -131,6 +135,9 @@ public String processRefToExternalResponse(String $ref, RefFormat refFormat) { } String newRef; + if (openAPI.getComponents() == null) { + openAPI.setComponents(new Components()); + } Map responses = openAPI.getComponents().getResponses(); if (responses == null) { @@ -186,6 +193,9 @@ public String processRefToExternalRequestBody(String $ref, RefFormat refFormat) } String newRef; + if (openAPI.getComponents() == null) { + openAPI.setComponents(new Components()); + } Map bodies = openAPI.getComponents().getRequestBodies(); if (bodies == null) { @@ -241,6 +251,9 @@ public String processRefToExternalHeader(String $ref, RefFormat refFormat) { } String newRef; + if (openAPI.getComponents() == null) { + openAPI.setComponents(new Components()); + } Map headers = openAPI.getComponents().getHeaders(); if (headers == null) { @@ -296,6 +309,9 @@ public String processRefToExternalSecurityScheme(String $ref, RefFormat refForma } String newRef; + if (openAPI.getComponents() == null) { + openAPI.setComponents(new Components()); + } Map securitySchemeMap = openAPI.getComponents().getSecuritySchemes(); if (securitySchemeMap == null) { @@ -351,6 +367,9 @@ public String processRefToExternalLink(String $ref, RefFormat refFormat) { } String newRef; + if (openAPI.getComponents() == null) { + openAPI.setComponents(new Components()); + } Map links = openAPI.getComponents().getLinks(); if (links == null) { @@ -406,6 +425,9 @@ public String processRefToExternalExample(String $ref, RefFormat refFormat) { } String newRef; + if (openAPI.getComponents() == null) { + openAPI.setComponents(new Components()); + } Map examples = openAPI.getComponents().getExamples(); if (examples == null) { @@ -461,6 +483,9 @@ public String processRefToExternalParameter(String $ref, RefFormat refFormat) { } String newRef; + if (openAPI.getComponents() == null) { + openAPI.setComponents(new Components()); + } Map parameters = openAPI.getComponents().getParameters(); if (parameters == null) { @@ -516,6 +541,9 @@ public String processRefToExternalCallback(String $ref, RefFormat refFormat) { } String newRef; + if (openAPI.getComponents() == null) { + openAPI.setComponents(new Components()); + } Map callbacks = openAPI.getComponents().getCallbacks(); if (callbacks == null) { diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java index de430f1988..b86e22adcd 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java @@ -136,7 +136,7 @@ public OpenAPI parseRoot(JsonNode node, ParseResult result) { openAPI.setPaths(paths); } - obj = getObject("components", rootNode, true, location, result); + obj = getObject("components", rootNode, false, location, result); if (obj != null) { Components components = getComponents(obj, "components", result); openAPI.setComponents(components); diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java index 304c8f117a..a90f8bd515 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java @@ -604,7 +604,17 @@ public void resolveComposedSchema(@Injectable final List aut } - @Test + public void referringSpecWithoutComponentsTag() throws Exception { + ParseOptions resolve = new ParseOptions(); + resolve.setResolveFully(true); + final OpenAPI openAPI = new OpenAPIV3Parser().read("src/test/resources/ref-without-component/a.yaml", null, resolve); + + Map schemas = openAPI.getComponents().getSchemas(); + Assert.assertEquals("Example value", schemas.get("CustomerType").getExample()); + } + + + public void testRefNameConflicts() throws Exception { ParseOptions options = new ParseOptions(); options.setResolveFully(true); @@ -617,6 +627,7 @@ public void testRefNameConflicts() throws Exception { AssertJUnit.assertEquals("referred", ((Schema) openAPI.getComponents().getSchemas().get("PersonObj_2").getProperties().get("location")).getExample()); } + private static int getDynamicPort() { return new Random().ints(50000, 60000).findFirst().getAsInt(); } diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/util/OpenAPIDeserializerTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/util/OpenAPIDeserializerTest.java index d57fd136d7..aae9f2db8f 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/util/OpenAPIDeserializerTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/util/OpenAPIDeserializerTest.java @@ -542,7 +542,6 @@ public void testAlmostEmpty(@Injectable List auths) { assertTrue(messages.contains("attribute info is missing")); assertTrue(messages.contains("attribute paths is missing")); - assertTrue(messages.contains("attribute components is missing")); assertTrue(messages.contains("attribute new is unexpected")); } diff --git a/modules/swagger-parser-v3/src/test/resources/ref-without-component/a.yaml b/modules/swagger-parser-v3/src/test/resources/ref-without-component/a.yaml new file mode 100644 index 0000000000..efec250888 --- /dev/null +++ b/modules/swagger-parser-v3/src/test/resources/ref-without-component/a.yaml @@ -0,0 +1,13 @@ +openapi: 3.0.0 +paths: + "/newPerson": + post: + summary: Create new person + description: Create new person + responses: + '200': + description: OK + content: + "*/*": + schema: + "$ref": "./src/test/resources/ref-without-component/b.yaml#/components/schemas/CustomerType" diff --git a/modules/swagger-parser-v3/src/test/resources/ref-without-component/b.yaml b/modules/swagger-parser-v3/src/test/resources/ref-without-component/b.yaml new file mode 100644 index 0000000000..4ca2604e6c --- /dev/null +++ b/modules/swagger-parser-v3/src/test/resources/ref-without-component/b.yaml @@ -0,0 +1,6 @@ +openapi: 3.0.0 +components: + schemas: + CustomerType: + type: string + example: Example value