diff --git a/modules/swagger-parser/pom.xml b/modules/swagger-parser/pom.xml
index 012f527224..48a6882ef8 100644
--- a/modules/swagger-parser/pom.xml
+++ b/modules/swagger-parser/pom.xml
@@ -20,6 +20,7 @@
maven-surefire-plugin
single
+ .
diff --git a/modules/swagger-parser/src/main/java/io/swagger/parser/util/SwaggerDeserializer.java b/modules/swagger-parser/src/main/java/io/swagger/parser/util/SwaggerDeserializer.java
index 6b36fdd02e..1069185bba 100644
--- a/modules/swagger-parser/src/main/java/io/swagger/parser/util/SwaggerDeserializer.java
+++ b/modules/swagger-parser/src/main/java/io/swagger/parser/util/SwaggerDeserializer.java
@@ -916,6 +916,16 @@ public Property property(ObjectNode node, String location, ParseResult result) {
}
}
}
+
+ // work-around for https://github.com/swagger-api/swagger-core/issues/1977
+ if(node.get("$ref") != null && node.get("$ref").isTextual()) {
+ // check if it's a relative ref
+ String refString = node.get("$ref").textValue();
+ if(refString.indexOf("/") == -1 && refString.indexOf(".") > 0) {
+ refString = "./" + refString;
+ node.put("$ref", refString);
+ }
+ }
return Json.mapper().convertValue(node, Property.class);
}
diff --git a/modules/swagger-parser/src/test/java/io/swagger/parser/FileReferenceTests.java b/modules/swagger-parser/src/test/java/io/swagger/parser/FileReferenceTests.java
new file mode 100644
index 0000000000..870679513a
--- /dev/null
+++ b/modules/swagger-parser/src/test/java/io/swagger/parser/FileReferenceTests.java
@@ -0,0 +1,27 @@
+package io.swagger.parser;
+
+import io.swagger.models.Swagger;
+import io.swagger.parser.util.SwaggerDeserializationResult;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+public class FileReferenceTests {
+ @Test
+ public void testIssue306() {
+ SwaggerDeserializationResult result = new SwaggerParser().readWithInfo("./src/test/resources/nested-file-references/issue-306.yaml", null, true);
+ assertNotNull(result.getSwagger());
+
+ Swagger swagger = result.getSwagger();
+
+ assertTrue(swagger.getDefinitions().size() == 3);
+ // resolved from `$ref: './book.yaml'`
+ assertNotNull(swagger.getDefinitions().get("Inventory"));
+ // resolved from `$ref: 'book.yaml'`
+ assertNotNull(swagger.getDefinitions().get("Orders"));
+
+ // copied from `./book.yaml`
+ assertNotNull(swagger.getDefinitions().get("book"));
+ }
+}
diff --git a/modules/swagger-parser/src/test/resources/nested-file-references/book.yaml b/modules/swagger-parser/src/test/resources/nested-file-references/book.yaml
new file mode 100644
index 0000000000..2e2236aee4
--- /dev/null
+++ b/modules/swagger-parser/src/test/resources/nested-file-references/book.yaml
@@ -0,0 +1,9 @@
+description: A book entity
+properties:
+ name:
+ type: string
+ title:
+ type: string
+ pages:
+ type: integer
+ format: int32
\ No newline at end of file
diff --git a/modules/swagger-parser/src/test/resources/nested-file-references/components/entities.yaml b/modules/swagger-parser/src/test/resources/nested-file-references/components/entities.yaml
new file mode 100644
index 0000000000..77b8b6f12f
--- /dev/null
+++ b/modules/swagger-parser/src/test/resources/nested-file-references/components/entities.yaml
@@ -0,0 +1,5 @@
+definitions:
+ Category:
+ properties:
+ name:
+ type: string
diff --git a/modules/swagger-parser/src/test/resources/nested-file-references/issue-306.yaml b/modules/swagger-parser/src/test/resources/nested-file-references/issue-306.yaml
new file mode 100644
index 0000000000..a263f2a13a
--- /dev/null
+++ b/modules/swagger-parser/src/test/resources/nested-file-references/issue-306.yaml
@@ -0,0 +1,18 @@
+swagger: '2.0'
+definitions:
+ Animal:
+ required:
+ - id
+ properties:
+ id:
+ type: string
+ categories:
+ $ref: './components/entities.yaml#/definitions/Category'
+ Inventory:
+ properties:
+ book:
+ $ref: './book.yaml'
+ Orders:
+ properties:
+ book:
+ $ref: 'book.yaml'
\ No newline at end of file