Hi Minh, it is be an improvement that Camel could implements Coud you please rise a JIRA for it ?
Camel team will check it too. https://issues.apache.org/jira/browse/CAMEL thx for this topic Best Regards, Bien à vous, どうぞお元気で, ____________________________________________________ Greg AUTRIC - JBoss Middleware Consultant - On Tue, Mar 8, 2016 at 11:21 PM, Minh Tran <darth.minhs...@gmail.com> wrote: > Hello > > I’m using camel 2.16.2 and I’m finding the bean parameter binding doesn’t > seem to work very well on overloaded methods. See below for an example > > public class ClassA { > public int foo() { > return 0; > } > > public int foo(String param1) { > return 1; > } > > public int foo(String param1, String param2) { > return 2; > } > > public int foo(String param1, ClassB param2) { > return 3; > } > > public int foo(boolean param1, String param2) { > return 4; > } > } > > public class ClassB { > > } > > Here are the routes > > from("direct:noParam").bean(ClassA.class, "foo()").to("mock:end"); > from("direct:1Param").bean(ClassA.class, "foo(${body})").to("mock:end"); > from("direct:2Param").bean(ClassA.class, "foo(${body}, > ${header.key})").to("mock:end”); > > And here are the tests > > @EndpointInject(uri = "mock:end") > private MockEndpoint end; > > @Produce > private ProducerTemplate producerTemplate; > > @Test > // passes > public void testNoParam() throws InterruptedException { > end.expectedBodiesReceived(0); > producerTemplate.sendBodyAndHeader("direct:noParam", > "body", "key", "value"); > end.assertIsSatisfied(); > } > > @Test > // passes > public void test1Param() throws InterruptedException { > end.expectedBodiesReceived(1); > producerTemplate.sendBodyAndHeader("direct:1Param", > "body", "key", "value"); > end.assertIsSatisfied(); > } > > @Test > // throws ambiguous method call exception > public void test2Param_string() throws InterruptedException { > end.expectedBodiesReceived(2); > producerTemplate.sendBodyAndHeader("direct:2Param", > "body", "key", "value"); > end.assertIsSatisfied(); > } > > @Test > // throws ambiguous method call exception > public void test2Param_classB() throws InterruptedException { > end.expectedBodiesReceived(3); > producerTemplate.sendBodyAndHeader("direct:2Param", > "body", "key", new ClassB()); > end.assertIsSatisfied(); > } > > @Test > // passes > public void test2Param_boolBody() throws InterruptedException { > end.expectedBodiesReceived(4); > producerTemplate.sendBodyAndHeader("direct:2Param", true, > "key", "value"); > end.assertIsSatisfied(); > } > > > I don’t understand why test2Param_string and test2Param_classB throw > ambiguous call exceptions. Here’s a sample stack trace. > > org.apache.camel.component.bean.AmbiguousMethodCallException: Ambiguous > method invocations possible: [public int > au.com.winning.navmidware.routes.navws.ClassA.foo(java.lang.String,java.lang.String), > public int > au.com.winning.navmidware.routes.navws.ClassA.foo(java.lang.String,au.com.winning.navmidware.routes.navws.ClassB)]. > Exchange[ID-minhmac-local-53614-1457474273519-0-2][Message: body] > at > org.apache.camel.component.bean.BeanInfo.chooseBestPossibleMethodInfo(BeanInfo.java:835) > ~[camel-core-2.16.2.jar:2.16.2] > at > org.apache.camel.component.bean.BeanInfo.chooseMethodWithMatchingBody(BeanInfo.java:764) > ~[camel-core-2.16.2.jar:2.16.2] > at > org.apache.camel.component.bean.BeanInfo.chooseMethod(BeanInfo.java:621) > ~[camel-core-2.16.2.jar:2.16.2] > at > org.apache.camel.component.bean.BeanInfo.createInvocation(BeanInfo.java:254) > ~[camel-core-2.16.2.jar:2.16.2] > at > org.apache.camel.component.bean.BeanInfo.createInvocation(BeanInfo.java:183) > ~[camel-core-2.16.2.jar:2.16.2] > > > From looking at the code in BeanInfo, I *think* it just tries to match the > type on the body and if it sees multiple possible methods then it throws > the exception. I believe it should go further and try to match the type on > the other parameters as well? > > To get around this issue temporarily, I’ve had to write an adapter class > that wraps around ClassA but it’s not an ideal solution.