aries-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Guillaume Nodet (JIRA)" <j...@apache.org>
Subject [jira] [Resolved] (ARIES-1282) BeanRecipe.findMatchingMethods is not able to filter out overridden method signatures
Date Wed, 31 Jan 2018 08:19:00 GMT

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

Guillaume Nodet resolved ARIES-1282.
------------------------------------
       Resolution: Fixed
         Assignee: Guillaume Nodet
    Fix Version/s: blueprint-core-1.9.0

Committing to https://svn.apache.org/repos/asf/aries/trunk ...
	A	blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/pojos/CachePojos.java
	A	blueprint/blueprint-core/src/test/resources/test-cache.xml
	M	blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/generics/TypeInference.java
	M	blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/WiringTest.java
Committed r1822771


> BeanRecipe.findMatchingMethods is not able to filter out overridden method signatures
> -------------------------------------------------------------------------------------
>
>                 Key: ARIES-1282
>                 URL: https://issues.apache.org/jira/browse/ARIES-1282
>             Project: Aries
>          Issue Type: Bug
>          Components: Blueprint
>    Affects Versions: blueprint-core-1.1.0, blueprint-core-1.4.2
>            Reporter: Niels Bertram
>            Assignee: Guillaume Nodet
>            Priority: Major
>             Fix For: blueprint-core-1.9.0
>
>
> I was trying to get an Infinispan cache object from an infinispan CacheManager using
the following blueprint configuration:
> {code:xml}
> <reference id="cacheManager" availability="mandatory" interface="org.infinispan.manager.CacheContainer"
/>
> <bean id="queueCountCache" factory-ref="cacheManager" factory-method="getCache">
> 	<argument index="0" type="java.lang.String" value="QueueCountCache" />
> </bean>
> {code}
> Unfortunately the blueprint startup fails with following error:
> {code}
> org.osgi.service.blueprint.container.ComponentDefinitionException: Multiple matching
factory methods getCache found on class Proxy36341b52_07db_4c05_bab0_40dbf8a3899a for arguments
[QueueCountCache] when instanciating bean queueCountCache: [public org.infinispan.commons.api.BasicCache
Proxy36341b52_07db_4c05_bab0_40dbf8a3899a.getCache(java.lang.String), public org.infinispan.Cache
Proxy36341b52_07db_4c05_bab0_40dbf8a3899a.getCache(java.lang.String)]
>         at org.apache.aries.blueprint.container.BeanRecipe.getInstance(BeanRecipe.java:305)[7:org.apache.aries.blueprint.core:1.4.0]
>         at org.apache.aries.blueprint.container.BeanRecipe.internalCreate2(BeanRecipe.java:806)[7:org.apache.aries.blueprint.core:1.4.0]
>         at org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:787)[7:org.apache.aries.blueprint.core:1.4.0]
>         ...
> {code}
> looking at the matches produced by the {{BeanRecipe.findMatchingMethods}} makes it obvious
that the {{CacheContainer}} implements an interface {{BasicCacheContainer}}. The {{CacheContainer}}
interface overrides the getCache(java.lang.String) that is initially defined in the {{BasicCacheContainer}}
without any changes. I guess this was implemented for some backward compatibility.
> {code}
> public org.infinispan.commons.api.BasicCache Proxy6e18b006_c93d_4840_bb4d_3522802f6a68.getCache(java.lang.String)=[QueueCountCache]
> {code}
> and
> {code}
> public org.infinispan.Cache                  Proxy6e18b006_c93d_4840_bb4d_3522802f6a68.getCache(java.lang.String)=[QueueCountCache]
> {code}
> The {{BeanRecipe.findMatchingMethods}} probably also needs to check if the method signatures
found are overridden by another method in the matching collection. If that is the case, all
methods that are overridden also need to be discharged.
> Here are the 2 offending interfaces that the {{BeanReceipe}} matches. Unfortunately the
CacheContainer getCache method is the one it should match but +not+ the one from BasicCacheContainer.
> {code:title=CacheContainer.java|borderStyle=solid}
> package org.infinispan.manager;
> import org.infinispan.Cache;
> import org.infinispan.commons.api.BasicCache;
> import org.infinispan.commons.api.BasicCacheContainer;
> public interface CacheContainer extends BasicCacheContainer {
>    @Override
>    <K, V> Cache<K, V> getCache();
>    @Override
>    <K, V> Cache<K, V> getCache(String cacheName);
> }
> {code}
> {code:title=BasicCacheContainer.java|borderStyle=solid}
> package org.infinispan.commons.api;
> public interface BasicCacheContainer extends Lifecycle {
>  
>    <K, V> BasicCache<K, V> getCache();
>    <K, V> BasicCache<K, V> getCache(String cacheName);
> }
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Mime
View raw message