Skip to content

Relative references from a file in a sub-folder to other folders do not resolve #305

Closed
@KaelenProctor

Description

@KaelenProctor

Originally from swagger-codegen swagger-api/swagger-codegen#3614

If you have a directory structure like

swagger.yaml
-folder1
 -file1.yaml
 -folder2
  -file2.yaml
-folder3
 -file3.yaml

then from file1.yaml it is unable to resolve references to file3.yaml or file2.yaml.

For the case in which file1 references file2, the exception thrown is:

Exception in thread "main" java.lang.RuntimeException: Unable to load RELATIVE ref: ../folder2/file2.yaml
        at io.swagger.parser.util.RefUtils.readExternalRef(RefUtils.java:140)
        at io.swagger.parser.ResolverCache.loadRef(ResolverCache.java:96)
        at io.swagger.parser.processors.ExternalRefProcessor.processRefToExternalDefinition(ExternalRefProcessor.java:30)
        at io.swagger.parser.processors.ExternalRefProcessor.processRefToExternalDefinition(ExternalRefProcessor.java:69)
        at io.swagger.parser.processors.PropertyProcessor.processRefProperty(PropertyProcessor.java:33)
        at io.swagger.parser.processors.PropertyProcessor.processProperty(PropertyProcessor.java:21)
        at io.swagger.parser.processors.PropertyProcessor.processObjectProperty(PropertyProcessor.java:59)
        at io.swagger.parser.processors.PropertyProcessor.processProperty(PropertyProcessor.java:27)
        at io.swagger.parser.processors.ResponseProcessor.processResponse(ResponseProcessor.java:21)
        at io.swagger.parser.processors.OperationProcessor.processOperation(OperationProcessor.java:45)
        at io.swagger.parser.processors.PathsProcessor.processPaths(PathsProcessor.java:89)
        at io.swagger.parser.SwaggerResolver.resolve(SwaggerResolver.java:40)
        at io.swagger.parser.SwaggerParser.read(SwaggerParser.java:66)
        at io.swagger.codegen.config.CodegenConfigurator.toClientOptInput(CodegenConfigurator.java:390)
        at io.swagger.codegen.cmd.Generate.run(Generate.java:221)
        at io.swagger.codegen.SwaggerCodegen.main(SwaggerCodegen.java:36)
Caused by: java.lang.RuntimeException: Could not find ../folder2/file2.yaml on the classpath
        at io.swagger.parser.util.ClasspathHelper.loadFileFromClasspath(ClasspathHelper.java:31)
        at io.swagger.parser.util.RefUtils.readExternalRef(RefUtils.java:135)
        ... 15 more

I created a suite of tests that I believe illustrate the problem, and attached it swagger-relative-file-references.zip.

The test cases that compare "./file1.yaml" vs "file.yaml" can likely be ignored, I created them for my own education to verify which formats of a relative reference were acceptable.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions