Uploaded image for project: 'OpenJPA'
  1. OpenJPA
  2. OPENJPA-1910

openjpa uses application ClassLoader for resolving BrokerFactory (revisited)

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 2.0.1, 2.1.0, 2.2.0
    • 2.1.0, 2.2.0
    • osgi
    • None
    • apache-karaf 2.1.0, openjdk-1.6.0b18

    Description

      We are using openjpa-2.0.1 with a thin wrapper inside apache-karaf.

      The wrapper essentially sets the context class loader to the class loader of the application bundle and then calls

      PersistenceProvider.createEntityManagerFactory(String emName, Map map)

      on the service exported by openjpa.

      We get an exception like cited at the end of this report, which is pretty much the same issue than OPENJPA-1491, where the exception occurred in the alternate method

      PersistenceProvider.createContainerEntityManagerFactory(PersistenceUnitInfo pui, Map m)

      The code in

      org.apache.openjpa.persistence.PersistenceProviderImpl.getBrokerFactory(PersistenceProviderImpl.java:148)

      reads

      BrokerFactory factory = getBrokerFactory(cp, poolValue, null);

      , which is exactly the same issue as in OPENJPA-1491, because the null CLassLoader causes the underlying code to use the context class loader, which is set to the class loader of the application and not the class loader of the openjpa bundle.

      Replacing the above mentioned line by

      BrokerFactory factory = getBrokerFactory(cp, poolValue, BundleUtils.getBundleClassLoader());

      would fix this issue as in OPENJPA-1491.

      (remark: BundleUtils.getBundleClassLoader() return null outside OSGi contexts, so this code works outside OSGi, too....)

      Best regards,

      Wolfgang

      My stack trace is:

      org.osgi.service.blueprint.container.ComponentDefinitionException: Error when instantiating bean entityManagerFactory of class null
      at org.apache.aries.blueprint.container.BeanRecipe.getInstance(BeanRecipe.java:233)[7:org.apache.aries.blueprint:0.3.0.incubating-SNAPSHOT]
      at org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:726)[7:org.apache.aries.blueprint:0.3.0.incubating-SNAPSHOT]
      at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:64)[7:org.apache.aries.blueprint:0.3.0.incubating-SNAPSHOT]
      at org.apache.aries.blueprint.container.BlueprintRepository.createInstances(BlueprintRepository.java:219)[7:org.apache.aries.blueprint:0.3.0.incubating-SNAPS
      HOT]
      at org.apache.aries.blueprint.container.BlueprintRepository.createAll(BlueprintRepository.java:147)[7:org.apache.aries.blueprint:0.3.0.incubating-SNAPSHOT]
      at org.apache.aries.blueprint.container.BlueprintContainerImpl.instantiateEagerComponents(BlueprintContainerImpl.java:624)[7:org.apache.aries.blueprint:0.3.0
      .incubating-SNAPSHOT]
      at org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintContainerImpl.java:315)[7:org.apache.aries.blueprint:0.3.0.incubating-SNAPSHOT]
      at org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintContainerImpl.java:213)[7:org.apache.aries.blueprint:0.3.0.incubating-SNAPSHOT]
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)[:1.6.0_20]
      at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)[:1.6.0_20]
      at java.util.concurrent.FutureTask.run(FutureTask.java:166)[:1.6.0_20]
      at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:165)[:1.6.0_20]
      at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:266)[:1.6.0_20]
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)[:1.6.0_20]
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)[:1.6.0_20]
      at java.lang.Thread.run(Thread.java:636)[:1.6.0_20]
      Caused by: <openjpa-2.0.1-r422266:989424 fatal user error> org.apache.openjpa.persistence.ArgumentException: Could not invoke the static newInstance method on the na
      med factory class "<<openjpa-2.0.1-r422266:989424 fatal user error> org.apache.openjpa.util.UserException: The named BrokerFactory "org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory" is not valid.>".
      at org.apache.openjpa.kernel.Bootstrap.newBrokerFactory(Bootstrap.java:70)
      at org.apache.openjpa.persistence.PersistenceProviderImpl.getBrokerFactory(PersistenceProviderImpl.java:148)
      at org.apache.openjpa.persistence.PersistenceProviderImpl.createEntityManagerFactory(PersistenceProviderImpl.java:94)
      at org.apache.openjpa.persistence.PersistenceProviderImpl.createEntityManagerFactory(PersistenceProviderImpl.java:154)
      at org.apache.openjpa.persistence.PersistenceProviderImpl.createEntityManagerFactory(PersistenceProviderImpl.java:65)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.6.0_20]
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)[:1.6.0_20]
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.6.0_20]
      at java.lang.reflect.Method.invoke(Method.java:616)[:1.6.0_20]
      at org.apache.aries.blueprint.container.AbstractServiceReferenceRecipe$JdkProxyFactory$1.invoke(AbstractServiceReferenceRecipe.java:632)
      at $Proxy48.createEntityManagerFactory(Unknown Source)
      at org.clazzes.util.jpa.provider.EntityManagerFactoryFactory.newEntityManagerFactory(EntityManagerFactoryFactory.java:67)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.6.0_20]
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)[:1.6.0_20]
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.6.0_20]
      at java.lang.reflect.Method.invoke(Method.java:616)[:1.6.0_20]
      at org.apache.aries.blueprint.utils.ReflectionUtils.invoke(ReflectionUtils.java:221)[7:org.apache.aries.blueprint:0.3.0.incubating-SNAPSHOT]
      at org.apache.aries.blueprint.container.BeanRecipe.invoke(BeanRecipe.java:844)[7:org.apache.aries.blueprint:0.3.0.incubating-SNAPSHOT]
      at org.apache.aries.blueprint.container.BeanRecipe.getInstance(BeanRecipe.java:231)[7:org.apache.aries.blueprint:0.3.0.incubating-SNAPSHOT]
      ... 15 more
      Caused by: <openjpa-2.0.1-r422266:989424 fatal user error> org.apache.openjpa.persistence.ArgumentException: The named BrokerFactory "org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory" is not valid.
      at org.apache.openjpa.kernel.Bootstrap.getFactoryClass(Bootstrap.java:159)
      at org.apache.openjpa.kernel.Bootstrap.invokeFactory(Bootstrap.java:111)
      at org.apache.openjpa.kernel.Bootstrap.newBrokerFactory(Bootstrap.java:62)
      ... 33 more
      Caused by: java.lang.ClassNotFoundException: org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory
      at java.net.URLClassLoader$1.run(URLClassLoader.java:217)[:1.6.0_20]
      at java.security.AccessController.doPrivileged(Native Method)[:1.6.0_20]
      at java.net.URLClassLoader.findClass(URLClassLoader.java:205)[:1.6.0_20]
      at java.lang.ClassLoader.loadClass(ClassLoader.java:321)[:1.6.0_20]
      at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)[:1.6.0_20]
      at java.lang.ClassLoader.loadClass(ClassLoader.java:266)[:1.6.0_20]
      at java.lang.Class.forName0(Native Method)[:1.6.0_20]
      at java.lang.Class.forName(Class.java:264)[:1.6.0_20]
      at org.apache.openjpa.kernel.Bootstrap.getFactoryClass(Bootstrap.java:157)
      ... 35 more

      Attachments

        Activity

          People

            curtisr7 Richard G. Curtis
            wolfgang.glas@ev-i.at Wolfgang Glas
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: