JDKProxyManager cannot proxy blueprint beans
--------------------------------------------

                 Key: ARIES-703
                 URL: https://issues.apache.org/jira/browse/ARIES-703
             Project: Aries
          Issue Type: Bug
          Components: Proxy
         Environment: Glassfish 3.1
            Reporter: Balazs Zsoldos


When there is no ASM between the bundles and aries proxy is installed the 
default proxy manager is JDKProxyManager. When there is a bean in a blueprint 
fragment that has for example tx:transaction inside creating the transactional 
proxy fails with the following stacktrace:


[#|2011-07-06T14:29:24.542+0200|SEVERE|glassfish3.1|org.apache.aries.blueprint.container.BlueprintContainerImpl|_ThreadID=27;_ThreadName=Thread-1;|Unable
 to start blueprint container for bundle 
biz.everit.audit.persistence.biz.everit.audit.persistence.impl
org.osgi.service.blueprint.container.ComponentDefinitionException: Unable to 
create proxy for bean eventPersistenceImpl in bundle 
biz.everit.audit.persistence.biz.everit.audit.persistence.impl version 
0.1.0.SNAPSHOT
        at 
org.apache.aries.blueprint.container.BeanRecipe.addInterceptors(BeanRecipe.java:695)
        at 
org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:730)
        at 
org.apache.aries.blueprint.di.AbstractRecipe$1.call(AbstractRecipe.java:71)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at 
org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:79)
        at 
org.apache.aries.blueprint.di.RefRecipe.internalCreate(RefRecipe.java:60)
        at 
org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:98)
        at 
org.apache.aries.blueprint.container.BlueprintRepository.createInstances(BlueprintRepository.java:220)
        at 
org.apache.aries.blueprint.container.BlueprintRepository.createInstance(BlueprintRepository.java:205)
        at 
org.apache.aries.blueprint.container.BlueprintRepository.create(BlueprintRepository.java:144)
        at 
org.apache.aries.blueprint.container.ServiceRecipe.createRecipe(ServiceRecipe.java:398)
        at 
org.apache.aries.blueprint.container.ServiceRecipe.createService(ServiceRecipe.java:271)
        at 
org.apache.aries.blueprint.container.ServiceRecipe.internalGetService(ServiceRecipe.java:243)
        at 
org.apache.aries.blueprint.container.ServiceRecipe.getService(ServiceRecipe.java:320)
        at 
org.apache.aries.blueprint.container.ServiceRecipe$TriggerServiceFactory.getService(ServiceRecipe.java:465)
        at 
org.apache.felix.framework.ServiceRegistrationImpl.getFactoryUnchecked(ServiceRegistrationImpl.java:310)
        at 
org.apache.felix.framework.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:221)
        at 
org.apache.felix.framework.ServiceRegistry.getService(ServiceRegistry.java:297)
        at org.apache.felix.framework.Felix.getService(Felix.java:3014)
        at 
org.apache.felix.framework.BundleContextImpl.getService(BundleContextImpl.java:329)
        at 
org.jvnet.hk2.osgiadapter.HK2Main$HK2ServiceTrackerCustomizer.addingService(HK2Main.java:260)
        at 
org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:896)
        at 
org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:261)
        at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:233)
        at 
org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:840)
        at 
org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:871)
        at 
org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:733)
        at 
org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:662)
        at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:3769)
        at org.apache.felix.framework.Felix.access$000(Felix.java:80)
        at org.apache.felix.framework.Felix$2.serviceChanged(Felix.java:722)
        at 
org.apache.felix.framework.ServiceRegistry.registerService(ServiceRegistry.java:107)
        at org.apache.felix.framework.Felix.registerService(Felix.java:2854)
        at 
org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:251)
        at 
org.apache.aries.blueprint.container.BlueprintContainerImpl.registerService(BlueprintContainerImpl.java:408)
        at 
org.apache.aries.blueprint.container.ServiceRecipe.register(ServiceRecipe.java:187)
        at 
org.apache.aries.blueprint.container.BlueprintContainerImpl.registerServices(BlueprintContainerImpl.java:666)
        at 
org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintContainerImpl.java:334)
        at 
org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintContainerImpl.java:230)
        at 
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at 
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98)
        at 
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)
Caused by: org.apache.aries.proxy.UnableToProxyException: The class 
biz.everit.audit.persistence.impl.EventPersistenceServiceImpl is not an 
interface and therefore a proxy cannot be generated.
        at 
org.apache.aries.proxy.impl.JdkProxyManager.getInterfaces(JdkProxyManager.java:43)
        at 
org.apache.aries.proxy.impl.JdkProxyManager.createNewProxy(JdkProxyManager.java:36)
        at 
org.apache.aries.proxy.impl.AbstractProxyManager.createDelegatingInterceptingProxy(AbstractProxyManager.java:75)
        at 
org.apache.aries.proxy.impl.AbstractProxyManager.createInterceptingProxy(AbstractProxyManager.java:53)
        at 
org.apache.aries.blueprint.container.BeanRecipe.addInterceptors(BeanRecipe.java:690)
        ... 47 more

It will always happen as we have the following line in BeanRecepe:

intercepted = BlueprintExtender.getProxyManager().createInterceptingProxy(b, 
                  ProxyUtils.asList(original.getClass()), original, 
                  new Collaborator(interceptorLookupKey, interceptors));

That means that the interface list is the class of the bean itself that is 
cannot be an interface. In case of JDKProxy we should derive the interfaces 
that the bean implements and those interface classes should be passed. However 
at this level (BeanRecipe) we do not know about the proxy manager...

The example blueprint file for this:

<bean id="eventPersistenceImpl" 
class="biz.everit.audit.persistence.impl.EventPersistenceServiceImpl">
                <tx:transaction method="*" value="Required" />
                <jpa:context property="em" 
unitname="biz.everit.audit.persistence.entity" type="TRANSACTION" />
</bean>

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to