Hi guys,

We seeing some strange behavior. Camel 3.21.2.

Before:
--------------

We have bean:

public class IMapHelperImpl {

      public void addPropToIMap(String trackID, String key, Object value, 
Exchange exchange) {
            // some code
      }
 
}

In blueprint.xml we configure the bean:
<bean id="IMapHelperImpl" class="com.youngtew.miniswitch.common.IMapHelperImpl">

And use it only passing 3 params. "Exchange" is a Camel-specific type, and dont 
need to be passed.
<camel:bean ref="IMapHelper" method="addPropToIMap(${header.customTrackID}, 
'Message_Protocol', 'DMS')" />

And this has always worked fine.

After:
----------------
Now we moved the bean to bundle A and created a interface and register it as a 
service in bundle A:

public interface IMapHelper {
      void addPropToIMap(String trackID, String key, Object value, Exchange 
exchange);
}

public class IMapHelperImpl implements IMapHelper{
      @Override
      public void addPropToIMap(String trackID, String key, Object value, 
Exchange exchange) {
            // some code
      }
}

Declare as service in blueprint:
      <bean id="IMapHelperImpl" 
class="com.youngtew.miniswitch.common.impl.IMapHelperImpl">
            <property name="txMapProp" ref="instance"/>
      </bean>
      <service interface="com.youngtew.miniswitch.common.IMapHelper" 
ref="IMapHelperImpl"/>

In bundle B we access and use the service in a camel route like before:
      <reference id="IMapHelper" 
interface="com.youngtew.miniswitch.common.IMapHelper" />

      <camel:bean ref="IMapHelper" 
method="addPropToIMap(${header.customTrackID}, 'Message_Protocol', 'DMS')" />

But we keep getting:
Caused by: org.apache.camel.component.bean.AmbiguousMethodCallException: 
Ambiguous method invocations possible: [
public void 
Proxyafd06aa7_d318_48fc_83c8_c1fca7b2423c.addPropToIMap(java.lang.String,java.lang.String,java.lang.Object,org.apache.camel.Exchange),
public abstract void 
com.youngtew.miniswitch.common.IMapHelper.addPropToIMap(java.lang.String,java.lang.String,java.lang.Object,org.apache.camel.Exchange)]
 on the exchange: Exchange[FB35D15A8E52D13-0000000000000000]

Although there is just one method with that name.

We can solve it with a work around by passing all 4 params by adding 
${exchange}, and it works:
<camel:bean ref="IMapHelper" method="addPropToIMap(${header.customTrackID}, 
'Message_Protocol', 'DMS', ${exchange})" />

So I was womdering what am I missing with regards to the bean binding when 
using it as a service compared to a local bean declaration.

Thanks for any suggestions.

Gabriel

Reply via email to