[ 
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)

Reply via email to