You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Christopher Harris (JIRA)" <ji...@apache.org> on 2017/01/25 12:42:26 UTC

[jira] [Updated] (CAMEL-10745) POJO @Produce @Consume does not work with multiple arguments anymore.

     [ https://issues.apache.org/jira/browse/CAMEL-10745?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Christopher Harris updated CAMEL-10745:
---------------------------------------
    Environment: Ubuntu 16.04, OpenJDK 1.7, Spring 4.2.6.RELEASE  (was: Ubuntu 16.04, OpenJDK 1.7)

> POJO @Produce @Consume does not work with multiple arguments anymore.
> ---------------------------------------------------------------------
>
>                 Key: CAMEL-10745
>                 URL: https://issues.apache.org/jira/browse/CAMEL-10745
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-core
>    Affects Versions: 2.16.0, 2.17.0, 2.18.0
>         Environment: Ubuntu 16.04, OpenJDK 1.7, Spring 4.2.6.RELEASE
>            Reporter: Christopher Harris
>
> Upgraded from 2.14 to 2.17.3. 
> Using Camel-Spring with annotation @Produce on an interface with a single method that has multiple arguments and @Consume on the implementation to create a remote method invocation over activemq.
> According to the documentation that since 2.16 the default behave of this usage has changed to use the new binding procedure. 
> When you use the word "default" in the documentation, it implies there is a choice to use a non-default way. 
> However my first problem is that there seems to be no way to override the default behaviour (binding to false), when using spring POJO beans.
> Based on the source code of [CamelPostProcessorHelper class method getInjectionValue|https://github.com/apache/camel/blob/52a739feb9da8acd29067304c7c8356bbc5ef4dd/camel-core/src/main/java/org/apache/camel/impl/CamelPostProcessorHelper.java#L224]. This method checks for an interface type and creates a proxy by using the ProxyHelper, that forces the binding to always be set to true. 
> This leads to my next problem, now with the binding turned on, it does not work for an interface method with multiple arguments on the producer side any more. (version > 2.16)
> While the [bean integration document|http://camel.apache.org/bean-binding.html] suggests: 
> {quote}
> you can explicitly specify the method name in the DSL or when using POJO Consuming or POJO Producing.
> {quote}
> In the source code of [AbstractCamelInvocationHandler invokeProxy  method|https://github.com/apache/camel/blob/52a739feb9da8acd29067304c7c8356bbc5ef4dd/camel-core/src/main/java/org/apache/camel/component/bean/AbstractCamelInvocationHandler.java#L117] when the binding is turned on, which is always, it tries to get all annotations for each argument. But because there isn't any, it assumes there is only one argument and sets the body of the in message to this value, ignoring the rest.
> This behaviour in my opinion is contradictory to the document, since no where in the documentation is it suggested you can only have one or no arguments in methods for POJO Producing. This wouldn't be a problem if there is a way to turn the default binding off. 
> This wasn't a problem before 2.16.
> Third issue, since you can only have one @Body annotation, tried to use the @Header annotation for each argument. This encountered an issue with the conversion of the java.util.Date Object as one of the arguments. It defaults to use toString and fromString to marshall and unmarshall the object. I have not tried to create custom type converters, I think any Java standard object should work out of box.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)