[ https://issues.apache.org/jira/browse/CAMEL-22103?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17953490#comment-17953490 ]
Dave Riseley commented on CAMEL-22103: -------------------------------------- Sorry - just updated the ticket, yes , here: [https://github.com/driseley/cxf-arrayconverter-test] > camel-cxf: CXF RS Rest service with optional query parameter fails > ------------------------------------------------------------------ > > Key: CAMEL-22103 > URL: https://issues.apache.org/jira/browse/CAMEL-22103 > Project: Camel > Issue Type: Bug > Components: camel-core, camel-cxf > Affects Versions: 4.10.4 > Environment: Camel 4.10.4 > Java 21 > Spring Boot 3.4.5 > CXF 4.1.1 > Reporter: Dave Riseley > Priority: Minor > > Whilst testing the fix for CAMEL-21912 we came across a regression where the > CXF RS service doesn't seem to be able to handle an optional query parameter. > An attempt to invoke the service handler fails with: > {noformat} > org.apache.camel.CamelExecutionException: Exception occurred during execution > on the exchange: Exchange[1318A61670C6512-0000000000000000] > at > org.apache.camel.CamelExecutionException.wrapCamelExecutionException(CamelExecutionException.java:45) > ~[camel-api-4.10.4.jar:4.10.4] > at > org.apache.camel.support.builder.ExpressionBuilder$42.evaluate(ExpressionBuilder.java:1480) > ~[camel-support-4.10.4.jar:4.10.4] > at > org.apache.camel.support.ExpressionAdapter.evaluate(ExpressionAdapter.java:45) > ~[camel-support-4.10.4.jar:4.10.4] > at > org.apache.camel.component.bean.MethodInfo$ParameterExpression.evaluateParameterBinding(MethodInfo.java:755) > ~[camel-bean-4.10.4.jar:4.10.4] > at > org.apache.camel.component.bean.MethodInfo$ParameterExpression.evaluateParameterExpressions(MethodInfo.java:635) > ~[camel-bean-4.10.4.jar:4.10.4] > at > org.apache.camel.component.bean.MethodInfo$ParameterExpression.evaluate(MethodInfo.java:603) > ~[camel-bean-4.10.4.jar:4.10.4] > at > org.apache.camel.component.bean.MethodInfo.initializeArguments(MethodInfo.java:262) > ~[camel-bean-4.10.4.jar:4.10.4] > at > org.apache.camel.component.bean.MethodInfo.createMethodInvocation(MethodInfo.java:270) > ~[camel-bean-4.10.4.jar:4.10.4] > at > org.apache.camel.component.bean.BeanInfo.createInvocation(BeanInfo.java:241) > ~[camel-bean-4.10.4.jar:4.10.4] > at > org.apache.camel.component.bean.AbstractBeanProcessor.useMethodInvocation(AbstractBeanProcessor.java:103) > ~[camel-bean-4.10.4.jar:4.10.4] > at > org.apache.camel.component.bean.AbstractBeanProcessor.process(AbstractBeanProcessor.java:89) > ~[camel-bean-4.10.4.jar:4.10.4] > at > org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:81) > ~[camel-bean-4.10.4.jar:4.10.4] > at > org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.handleFirst(RedeliveryErrorHandler.java:440) > ~[camel-core-processor-4.10.4.jar:4.10.4] > at > org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:416) > ~[camel-core-processor-4.10.4.jar:4.10.4] > at > org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.doRun(DefaultReactiveExecutor.java:199) > ~[camel-base-engine-4.10.4.jar:4.10.4] > at > org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeReactiveWork(DefaultReactiveExecutor.java:189) > ~[camel-base-engine-4.10.4.jar:4.10.4] > at > org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.tryExecuteReactiveWork(DefaultReactiveExecutor.java:166) > ~[camel-base-engine-4.10.4.jar:4.10.4] > at > org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:148) > ~[camel-base-engine-4.10.4.jar:4.10.4] > at > org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:59) > ~[camel-base-engine-4.10.4.jar:4.10.4] > at org.apache.camel.processor.Pipeline.process(Pipeline.java:163) > ~[camel-core-processor-4.10.4.jar:4.10.4] > at > org.apache.camel.impl.engine.CamelInternalProcessor.processNonTransacted(CamelInternalProcessor.java:347) > ~[camel-base-engine-4.10.4.jar:4.10.4] > at > org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:323) > ~[camel-base-engine-4.10.4.jar:4.10.4] > at > org.apache.camel.component.cxf.jaxrs.CxfRsInvoker.asyncInvoke(CxfRsInvoker.java:100) > ~[camel-cxf-rest-4.10.4.jar:4.10.4] > at > org.apache.camel.component.cxf.jaxrs.CxfRsInvoker.performInvocation(CxfRsInvoker.java:72) > ~[camel-cxf-rest-4.10.4.jar:4.10.4] > at > org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96) > ~[cxf-core-4.1.1.jar:4.1.1] > at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:200) > ~[cxf-rt-frontend-jaxrs-4.1.1.jar:4.1.1] > at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:103) > ~[cxf-rt-frontend-jaxrs-4.1.1.jar:4.1.1] > at > org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59) > ~[cxf-core-4.1.1.jar:4.1.1] > at > org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:96) > ~[cxf-core-4.1.1.jar:4.1.1] > at > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307) > ~[cxf-core-4.1.1.jar:4.1.1] > at > org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) > ~[cxf-core-4.1.1.jar:4.1.1] > at > org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:267) > ~[cxf-rt-transports-http-4.1.1.jar:4.1.1] > at > org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:238) > ~[cxf-rt-transports-http-jetty-4.1.1.jar:4.1.1] > at > org.apache.cxf.transport.http_jetty.JettyHTTPHandler.service(JettyHTTPHandler.java:97) > ~[cxf-rt-transports-http-jetty-4.1.1.jar:4.1.1] > at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) > ~[tomcat-embed-core-10.1.40.jar:6.0] > at > org.eclipse.jetty.ee10.servlet.ServletHolder.handle(ServletHolder.java:736) > ~[jetty-ee10-servlet-12.0.19.jar:12.0.19] > at > org.eclipse.jetty.ee10.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1622) > ~[jetty-ee10-servlet-12.0.19.jar:12.0.19] > at > org.eclipse.jetty.ee10.servlet.ServletHandler$MappedServlet.handle(ServletHandler.java:1555) > ~[jetty-ee10-servlet-12.0.19.jar:12.0.19] > at > org.eclipse.jetty.ee10.servlet.ServletChannel.dispatch(ServletChannel.java:819) > ~[jetty-ee10-servlet-12.0.19.jar:12.0.19] > at > org.eclipse.jetty.ee10.servlet.ServletChannel.handle(ServletChannel.java:436) > ~[jetty-ee10-servlet-12.0.19.jar:12.0.19] > at > org.eclipse.jetty.ee10.servlet.ServletHandler.handle(ServletHandler.java:470) > ~[jetty-ee10-servlet-12.0.19.jar:12.0.19] > at > org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:1064) > ~[jetty-server-12.0.19.jar:12.0.19] > at > org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:151) > ~[jetty-server-12.0.19.jar:12.0.19] > at org.eclipse.jetty.server.Server.handle(Server.java:182) > ~[jetty-server-12.0.19.jar:12.0.19] > at > org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:662) > ~[jetty-server-12.0.19.jar:12.0.19] > at > org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:416) > ~[jetty-server-12.0.19.jar:12.0.19] > at > org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:322) > ~[jetty-io-12.0.19.jar:12.0.19] > at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:99) > ~[jetty-io-12.0.19.jar:12.0.19] > at > org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53) > ~[jetty-io-12.0.19.jar:12.0.19] > at > org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:979) > ~[jetty-util-12.0.19.jar:12.0.19] > at > org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1209) > ~[jetty-util-12.0.19.jar:12.0.19] > at > org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1164) > ~[jetty-util-12.0.19.jar:12.0.19] > at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na] > Caused by: org.apache.camel.InvalidPayloadException: No body available of > type: java.lang.String but has type: > org.apache.cxf.message.MessageContentsList on: Message. Caused by: Error > during type conversion from type: org.apache.cxf.message.MessageContentsList > to the required type: java.lang.String with value [null] due to > java.lang.ClassCastException: class java.lang.Class cannot be cast to class > java.lang.String (java.lang.Class and java.lang.String are in module > java.base of loader 'bootstrap'). Exchange[1318A61670C6512-0000000000000000]. > Caused by: [org.apache.camel.TypeConversionException - Error during type > conversion from type: org.apache.cxf.message.MessageContentsList to the > required type: java.lang.String with value [null] due to > java.lang.ClassCastException: class java.lang.Class cannot be cast to class > java.lang.String (java.lang.Class and java.lang.String are in module > java.base of loader 'bootstrap')] > at > org.apache.camel.support.MessageSupport.getMandatoryBody(MessageSupport.java:130) > ~[camel-support-4.10.4.jar:4.10.4] > at > org.apache.camel.support.builder.ExpressionBuilder$42.evaluate(ExpressionBuilder.java:1478) > ~[camel-support-4.10.4.jar:4.10.4] > ... 51 common frames omitted > Caused by: org.apache.camel.TypeConversionException: Error during type > conversion from type: org.apache.cxf.message.MessageContentsList to the > required type: java.lang.String with value [null] due to > java.lang.ClassCastException: class java.lang.Class cannot be cast to class > java.lang.String (java.lang.Class and java.lang.String are in module > java.base of loader 'bootstrap') > at > org.apache.camel.support.SimpleTypeConverter.convertTo(SimpleTypeConverter.java:105) > ~[camel-support-4.10.4.jar:4.10.4] > at > org.apache.camel.impl.converter.CoreTypeConverterRegistry.tryCachedConverters(CoreTypeConverterRegistry.java:408) > ~[camel-base-4.10.4.jar:4.10.4] > at > org.apache.camel.impl.converter.CoreTypeConverterRegistry.doConvertTo(CoreTypeConverterRegistry.java:375) > ~[camel-base-4.10.4.jar:4.10.4] > at > org.apache.camel.impl.converter.CoreTypeConverterRegistry.doConvertToAndStat(CoreTypeConverterRegistry.java:269) > ~[camel-base-4.10.4.jar:4.10.4] > at > org.apache.camel.impl.converter.CoreTypeConverterRegistry.mandatoryConvertTo(CoreTypeConverterRegistry.java:193) > ~[camel-base-4.10.4.jar:4.10.4] > at > org.apache.camel.support.MessageSupport.getMandatoryBody(MessageSupport.java:128) > ~[camel-support-4.10.4.jar:4.10.4] > ... 52 common frames omitted > Caused by: java.lang.ClassCastException: class java.lang.Class cannot be cast > to class java.lang.String (java.lang.Class and java.lang.String are in module > java.base of loader 'bootstrap') > at > org.apache.camel.component.cxf.converter.CxfConverter.toString(CxfConverter.java:103) > ~[camel-cxf-common-4.10.4.jar:4.10.4] > at > org.apache.camel.component.cxf.converter.CxfConverterLoader.lambda$registerConverters$3(CxfConverterLoader.java:55) > ~[camel-cxf-common-4.10.4.jar:4.10.4] > at > org.apache.camel.support.SimpleTypeConverter.convertTo(SimpleTypeConverter.java:101) > ~[camel-support-4.10.4.jar:4.10.4] > ... 57 common frames omitted > {noformat} > A full reproducer test case is available from: > [https://github.com/driseley/cxf-arrayconverter-test] > The summary of the tests is that in 4.10.3, both the following tests pass: > {code:java} > // Call the echo CXF Rest service > Exchange responseExchange = > producerTemplate.send("http://localhost:8001/echo?say=hello", e -> {}); > assertNull(responseExchange.getException()); > assertEquals(200, > responseExchange.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE, > Integer.class)); > // This is the expected output - the value of the say query paramater > assertEquals("hello", > responseExchange.getMessage().getBody(String.class)); > {code} > {code:java} > // Call the echo CXF Rest service > Exchange responseExchange = > producerTemplate.send("http://localhost:8001/echo", e -> {}); > assertNull(responseExchange.getException()); > assertEquals(200, > responseExchange.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE, > Integer.class)); > // This is the expected output - the value of the say query parameter > - which is null > assertEquals("null", > responseExchange.getMessage().getBody(String.class)); > {code} > but in 4.10.4, the second test fails with a HTTP/500 and the stacktrace above -- This message was sent by Atlassian Jira (v8.20.10#820010)