swagger-parser icon indicating copy to clipboard operation
swagger-parser copied to clipboard

Resolving relative refs broken with Spring Boot 3.2

Open david0 opened this issue 2 months ago • 4 comments

Parsing schemas with refs to other files fails with the following exception, when the jar file is run:

08:35:32.381 [main] WARN io.swagger.v3.parser.OpenAPIV3Parser -- Exception while resolving:
java.lang.RuntimeException: Unable to load RELATIVE ref: ./error.openapi.yaml path: /specs
        at io.swagger.v3.parser.util.RefUtils.readExternalRef(RefUtils.java:220)
        at io.swagger.v3.parser.ResolverCache.loadRef(ResolverCache.java:156)
        at io.swagger.v3.parser.processors.ExternalRefProcessor.processRefToExternalSchema(ExternalRefProcessor.java:89)
        at io.swagger.v3.parser.processors.SchemaProcessor.processReferenceSchema(SchemaProcessor.java:238)
        at io.swagger.v3.parser.processors.SchemaProcessor.processSchema(SchemaProcessor.java:59)
        at io.swagger.v3.parser.processors.ResponseProcessor.processResponse(ResponseProcessor.java:56)
        at io.swagger.v3.parser.processors.OperationProcessor.processOperation(OperationProcessor.java:86)
        at io.swagger.v3.parser.processors.PathsProcessor.processPaths(PathsProcessor.java:88)
        at io.swagger.v3.parser.OpenAPIResolver.resolve(OpenAPIResolver.java:72)
        at io.swagger.v3.parser.OpenAPIResolver.resolve(OpenAPIResolver.java:59)
        at io.swagger.v3.parser.OpenAPIV3Parser.resolve(OpenAPIV3Parser.java:240)
        at io.swagger.v3.parser.OpenAPIV3Parser.readContents(OpenAPIV3Parser.java:183)
        at io.swagger.v3.parser.OpenAPIV3Parser.readLocation(OpenAPIV3Parser.java:97)
        at io.swagger.v3.parser.OpenAPIV3Parser.read(OpenAPIV3Parser.java:124)
        at com.example.demo.DemoApplication.main(DemoApplication.java:17)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:91)
        at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:53)
        at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:58)
Caused by: java.lang.UnsupportedOperationException: null
        at jdk.zipfs/jdk.nio.zipfs.ZipPath.toFile(ZipPath.java:669)
        at io.swagger.v3.parser.util.RefUtils.readAll(RefUtils.java:228)
        at io.swagger.v3.parser.util.RefUtils.readExternalRef(RefUtils.java:191)
        ... 21 common frames omitted
08:35:32.383 [main] INFO io.swagger.v3.parser.OpenAPIV3Parser -- io.swagger.v3.parser.OpenAPIV3Parser@75c56eb9: attribute paths.'/pets'(get).responses.default.content.'application/json'.schema.#/components/schemas/Error is missing
08:35:32.384 [main] INFO io.swagger.v3.parser.OpenAPIV3Parser -- io.swagger.v3.parser.OpenAPIV3Parser@75c56eb9: attribute paths.'/pets'(post).responses.default.content.'application/json'.schema.#/components/schemas/Error is missing
08:35:32.384 [main] INFO io.swagger.v3.parser.OpenAPIV3Parser -- io.swagger.v3.parser.OpenAPIV3Parser@75c56eb9: Unable to load RELATIVE ref: ./error.openapi.yaml path: /specs

I'm using Spring Boot 3.2.x which has a nested jar and the loader has been re-written in Spring Boot 3.2: Spring Boot 3.2 Release Notes: Nested Jar Support. This seems to break the OpenAPI Parsers way of resolving $refs.

Small project to repoduce the problem can be found here: david0/swagger-parser-spring3.2-issue2080 Don't forget to run the jar and not via IDE to reproduce the problem.

david0 avatar Apr 26 '24 06:04 david0