Minh Tran created CAMEL-9690: -------------------------------- Summary: bean parameter binding should check parameter types Key: CAMEL-9690 URL: https://issues.apache.org/jira/browse/CAMEL-9690 Project: Camel Issue Type: Improvement Components: camel-core Affects Versions: 2.16.2 Environment: mac Reporter: Minh Tran Priority: Minor
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 {noformat} 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 { } {noformat} Here are the routes {noformat} 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”); {noformat} And here are the tests {noformat} @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(); } {noformat} I don’t understand why test2Param_string and test2Param_classB throw ambiguous call exceptions. Here’s a sample stack trace. {noformat} 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] {noformat} >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. -- This message was sent by Atlassian JIRA (v6.3.4#6332)