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