Uploaded image for project: 'Aries'
  1. Aries
  2. ARIES-703

JDKProxyManager cannot proxy blueprint beans

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • None
    • blueprint-0.4.0
    • Blueprint
    • None
    • Glassfish 3.1

    Description

      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>

      Attachments

        Activity

          People

            timothyjward Timothy James Ward
            balazs.zsoldos Balazs Zsoldos
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: