Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Camel TypeConverterLoader in native mode #3857

Closed
juliuskrah opened this issue Jun 18, 2022 · 4 comments
Closed

Camel TypeConverterLoader in native mode #3857

juliuskrah opened this issue Jun 18, 2022 · 4 comments

Comments

@juliuskrah
Copy link

Camel Quarkus: 2.9.2.Final
Quarkus: 2.9.2.Final
JDK: 17
Extension: camel-quarkus-jackson

When quarkus is built in native mode, the Service Locator for Camel TypeConverterLoader is not loaded. Below is my application.properties

quarkus.log.min-level=TRACE
quarkus.log.category."org.apache.camel.impl.converter.CoreTypeConverterRegistry".level=TRACE
# Register org.apache.camel.component.jackson.converter.JacksonTypeConvertersLoader
quarkus.native.auto-service-loader-registration=true
quarkus.native.additional-build-args=-H:ReflectionConfigurationFiles=reflection-config.json

The class JacksonTypeConverters is also registered for reflection in src/main/resources/reflection-config.json

[
    {
        "name": "org.apache.camel.component.jackson.converter.JacksonTypeConverters",
        "allDeclaredConstructors": true,
        "allPublicConstructors": true,
        "allDeclaredMethods": true,
        "allPublicMethods": true,
        "allDeclaredFields": true,
        "allPublicFields": true
    }
]

The service registration of camel-jackson-3.16.0.jar/META-INF/services/org/apache/camel/TypeConverterLoader is not happening

@jamesnetherton
Copy link
Contributor

What's the actual issue you are facing?

Camel Quarkus automatically discovers all TypeConverterLoader instances at build time. There is no need to register services or configure reflection for them.

@juliuskrah
Copy link
Author

I get the error below in native mode; it is ok in JVM mode. I have uploaded a reproducer. The Readme contains the RabbitMQ payload
reproducer.zip

2022-06-19 10:20:39,179 WARN  [org.apa.cam.com.rab.RabbitMQConsumer] (Camel (camel-1) thread #3 - rabbitmq://IN.GEN.TPG.PAYMENTS) Error processing exchange. Exchange[3A9EFDB8E981AD2-0000000000000000]. Caused by: [org.apache.camel.component.bean.ParameterBindingException - Error during parameter binding on method: io.example.dto.AcknowledgementRequest io.example.components.RequestHandler.handleAcknowledgeRequest(io.example.dto.Acknowledgement) at parameter #0 with type: class io.example.dto.Acknowledgement with value type: class java.lang.String and value: {
    "receiptNumber": "123456789",
    "statusCode": 111,
    "tokenService": 0,
    "amount": 10.0,
    "statusDescription": "A success",
    "beepTransactionId": 123123123,
    "payerTransactionId": "some random string"
}
]: org.apache.camel.component.bean.ParameterBindingException: Error during parameter binding on method: io.example.dto.AcknowledgementRequest io.example.components.RequestHandler.handleAcknowledgeRequest(io.example.dto.Acknowledgement) at parameter #0 with type: class io.example.dto.Acknowledgement with value type: class java.lang.String and value: {
    "receiptNumber": "123456789",
    "statusCode": 111,
    "tokenService": 0,
    "amount": 10.0,
    "statusDescription": "A success",
    "beepTransactionId": 123123123,
    "payerTransactionId": "some random string"
}

        at org.apache.camel.component.bean.MethodInfo$ParameterExpression.evaluateParameterValue(MethodInfo.java:723)
        at org.apache.camel.component.bean.MethodInfo$ParameterExpression.evaluateParameterExpressions(MethodInfo.java:619)
        at org.apache.camel.component.bean.MethodInfo$ParameterExpression.evaluate(MethodInfo.java:592)
        at org.apache.camel.component.bean.MethodInfo.initializeArguments(MethodInfo.java:263)
        at org.apache.camel.component.bean.MethodInfo.createMethodInvocation(MethodInfo.java:271)
        at org.apache.camel.component.bean.BeanInfo.createInvocation(BeanInfo.java:277)
        at org.apache.camel.component.bean.AbstractBeanProcessor.process(AbstractBeanProcessor.java:126)
        at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:81)
        at org.apache.camel.component.bean.BeanProducer.process(BeanProducer.java:41)
        at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:172)
        at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:471)
        at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:193)
        at org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:64)
        at org.apache.camel.processor.Pipeline.process(Pipeline.java:184)
        at org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:399)
        at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:83)
        at org.apache.camel.support.AsyncProcessorSupport.process(AsyncProcessorSupport.java:41)
        at org.apache.camel.component.rabbitmq.RabbitConsumer.doHandleDelivery(RabbitConsumer.java:113)
        at org.apache.camel.component.rabbitmq.RabbitConsumer.handleDelivery(RabbitConsumer.java:88)
        at com.rabbitmq.client.impl.ConsumerDispatcher$5.run(ConsumerDispatcher.java:149)
        at com.rabbitmq.client.impl.ConsumerWorkService$WorkPoolRunnable.run(ConsumerWorkService.java:104)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at java.lang.Thread.run(Thread.java:833)
        at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:597)
        at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:194)
Caused by: org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: java.lang.String to the required type: io.example.dto.Acknowledgement
        at org.apache.camel.impl.converter.CoreTypeConverterRegistry.mandatoryConvertTo(CoreTypeConverterRegistry.java:274)
        at org.apache.camel.component.bean.MethodInfo$ParameterExpression.evaluateParameterValue(MethodInfo.java:712)
        ... 25 more

@jamesnetherton
Copy link
Contributor

Add annotation @RegisterForReflection to io.example.dto.Acknowledgement.

@juliuskrah
Copy link
Author

Add annotation @RegisterForReflection to io.example.dto.Acknowledgement.

This did the trick. Closing issue

@zhfeng zhfeng added this to the 2.11.0 milestone Jun 21, 2022
@zbendhiba zbendhiba modified the milestones: 2.11.0, No fix/wont't fix Jun 21, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants