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 c33ac684b7..3248076a80 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 @@ -283,8 +283,18 @@ public Schema resolveSchema(Schema schema) { if(schema.get$ref() != null) { String ref= schema.get$ref(); - ref = ref.substring(ref.lastIndexOf("/") + 1); - Schema resolved = schemas != null ? schemas.get(ref) : null; + Schema resolved; + //This validation is done to solve deep properties eg. '#/components/schemas/TypeProject/properties/id' + if (ref.contains("/properties/")){ + String split[] = ref.split("/"); + String refSchema = split[3]; + Schema parentSchema = schemas.get(refSchema); + ref = ref.substring(ref.lastIndexOf("/") + 1); + resolved = (Schema)parentSchema.getProperties().get(ref); + }else { + ref = ref.substring(ref.lastIndexOf("/") + 1); + resolved = schemas != null ? schemas.get(ref) : null; + } if (resolved != null) { diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java index 37f1574293..4f595bcec2 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java @@ -69,6 +69,7 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertThat; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; @@ -82,6 +83,18 @@ public class OpenAPIV3ParserTest { protected int serverPort = getDynamicPort(); protected WireMockServer wireMockServer; + @Test + public void testCantReadDeepProperties() { + OpenAPIV3Parser parser = new OpenAPIV3Parser(); + ParseOptions options = new ParseOptions(); + options.setResolveFully(true); + + final SwaggerParseResult parseResult = parser.readLocation("src/test/resources/cant-read-deep-properties.yaml", null, options); + assertEquals(parseResult.getMessages().size(), 0); + Schema projects = (Schema) parseResult.getOpenAPI().getComponents().getSchemas().get("Project").getProperties().get("project_type"); + assertEquals(projects.getType(), "integer"); + } + @Test public void testIssueSameRefsDifferentModel() throws IOException { String pathFile = FileUtils.readFileToString(new File("src/test/resources/same-refs-different-model-domain.yaml"), "UTF-8"); diff --git a/modules/swagger-parser-v3/src/test/resources/cant-read-deep-properties.yaml b/modules/swagger-parser-v3/src/test/resources/cant-read-deep-properties.yaml new file mode 100644 index 0000000000..9221a92a8f --- /dev/null +++ b/modules/swagger-parser-v3/src/test/resources/cant-read-deep-properties.yaml @@ -0,0 +1,78 @@ +openapi: 3.0.0 +servers: + # Added by API Auto Mocking Plugin + - description: SwaggerHub API Auto Mocking + url: http://host.docker.internal:8081/p.siudy2/awfsdgrfhtgh/1.0 + +info: + version: '1.0' + title: issue + description: TypeProject/properties/id is not resolved + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +tags: + - name: issue + description: issue +paths: + /projects: + get: + tags: + - project + description: list projects + responses: + '200': + description: results + content: + application/json: + schema: + type: object + properties: + projects: + type: array + items: + $ref: '#/components/schemas/Project' + '400': + description: Invalid + '401': + description: You are not authorized + '500': + description: Internal Server Error +components: + schemas: + ProjectId: + type: integer + enum: [1, 2] + description: one of project type ids + Project: + type: object + required: + - user + - project_type + properties: + user: + $ref: '#/components/schemas/User' + project_type: + $ref: '#/components/schemas/TypeProject/properties/id' + User: + type: object + required: + - full_name + - id + properties: + full_name: + type: string + example: ful lname + id: + type: string + format: uuid + TypeProject: + type: object + properties: + id: + type: integer + enum: [1, 2] + description: one of project type ids + name: + type: string + enum: ['project1', 'project2'] \ No newline at end of file diff --git a/pom.xml b/pom.xml index 3fd2c7bd2d..ba0a75585d 100644 --- a/pom.xml +++ b/pom.xml @@ -369,7 +369,7 @@ 1.0.55-SNAPSHOT 2.6 1.7.30 - 2.1.7-SNAPSHOT + 2.1.8-SNAPSHOT 1.6.3-SNAPSHOT 4.13.1 6.14.2