apache / camel-quarkus

Apache Camel Quarkus
https://camel.apache.org
Apache License 2.0
251 stars 186 forks source link

[camel-main] Rest OpenAPI classpath schema resolution is broken in native mode #5945

Closed jamesnetherton closed 2 months ago

jamesnetherton commented 3 months ago

Bug description

Not sure what's changed. But if you use the classpath: scheme to resolve an OpenAPI spec document, it seems to no longer work in native mode. I disabled the problem tests for now (testInvokeClasspathApiEndpoint & testInvokeApiEndpointWithRequestValidationEnabled).

2024-04-03 10:41:34,129 WARN  [io.swa.v3.par.OpenAPIV3Parser] (executor-thread-1) Exception while reading:: io.swagger.v3.parser.exception.ReadContentException: Unable to read location `resource:/openapi.json`
    at io.swagger.v3.parser.OpenAPIV3Parser.readContentFromLocation(OpenAPIV3Parser.java:310)
    at io.swagger.v3.parser.OpenAPIV3Parser.readLocation(OpenAPIV3Parser.java:95)
    at org.apache.camel.component.rest.openapi.RestOpenApiEndpoint.loadSpecificationFrom(RestOpenApiEndpoint.java:890)
    at org.apache.camel.component.rest.openapi.RestOpenApiEndpoint.createProducer(RestOpenApiEndpoint.java:305)
    at org.apache.camel.support.DefaultEndpoint.createAsyncProducer(DefaultEndpoint.java:199)
    at org.apache.camel.support.cache.ServicePool$SinglePool.acquire(ServicePool.java:251)
    at org.apache.camel.support.cache.ServicePool$SinglePool.acquire(ServicePool.java:230)
    at org.apache.camel.support.cache.ServicePool.acquire(ServicePool.java:122)
    at org.apache.camel.support.cache.ProducerServicePool.acquire(ProducerServicePool.java:28)
    at org.apache.camel.support.cache.DefaultProducerCache.acquireProducer(DefaultProducerCache.java:134)
    at org.apache.camel.support.cache.DefaultProducerCache.doInAsyncProducer(DefaultProducerCache.java:246)
    at org.apache.camel.processor.SendDynamicProcessor.process(SendDynamicProcessor.java:205)
    at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.handleFirst(RedeliveryErrorHandler.java:462)
    at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:438)
    at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.doRun(DefaultReactiveExecutor.java:199)
    at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeReactiveWork(DefaultReactiveExecutor.java:189)
    at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.tryExecuteReactiveWork(DefaultReactiveExecutor.java:166)
    at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:148)
    at org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:59)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:163)
    at org.apache.camel.impl.engine.CamelInternalProcessor.processNonTransacted(CamelInternalProcessor.java:355)
    at org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:331)
    at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:96)
    at org.apache.camel.impl.engine.SharedCamelInternalProcessor.processNonTransacted(SharedCamelInternalProcessor.java:199)
    at org.apache.camel.impl.engine.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:173)
    at org.apache.camel.impl.engine.SharedCamelInternalProcessor$1.process(SharedCamelInternalProcessor.java:109)
    at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:82)
    at org.apache.camel.impl.engine.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:106)
    at org.apache.camel.support.cache.DefaultProducerCache.send(DefaultProducerCache.java:178)
    at org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:176)
    at org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:172)
    at org.apache.camel.impl.engine.DefaultProducerTemplate.requestBodyAndHeader(DefaultProducerTemplate.java:429)
    at org.apache.camel.quarkus.component.rest.openapi.it.RestOpenapiResource.invokeApiOperation(RestOpenapiResource.java:106)
    at org.apache.camel.quarkus.component.rest.openapi.it.RestOpenapiResource.invokeListFruitsOperationClasspath(RestOpenapiResource.java:75)
    at org.apache.camel.quarkus.component.rest.openapi.it.RestOpenapiResource_ClientProxy.invokeListFruitsOperationClasspath(Unknown Source)
Caused by: java.lang.IllegalArgumentException: The given OpenApi specification cannot be loaded from: classpath:openapi.json
    at org.apache.camel.component.rest.openapi.RestOpenApiEndpoint.loadSpecificationFrom(RestOpenApiEndpoint.java:905)
    at org.apache.camel.component.rest.openapi.RestOpenApiEndpoint.createProducer(RestOpenApiEndpoint.java:305)
    at org.apache.camel.support.DefaultEndpoint.createAsyncProducer(DefaultEndpoint.java:199)
    at org.apache.camel.support.cache.ServicePool$SinglePool.acquire(ServicePool.java:251)
    at org.apache.camel.support.cache.ServicePool$SinglePool.acquire(ServicePool.java:230)
    at org.apache.camel.support.cache.ServicePool.acquire(ServicePool.java:122)
    at org.apache.camel.support.cache.ProducerServicePool.acquire(ProducerServicePool.java:28)
    at org.apache.camel.support.cache.DefaultProducerCache.acquireProducer(DefaultProducerCache.java:134)
    ... 56 more
jamesnetherton commented 2 months ago

This is fixed now. Since Camel switched to the Swagger OpenAPIV3Parser we needed some additional substitutions for native mode resource loading.