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)

Reply via email to