openjpa úses applicationlassLoader for resolving BrokerFactory (revisited)
--------------------------------------------------------------------------
Key: OPENJPA-1910
URL: https://issues.apache.org/jira/browse/OPENJPA-1910
Project: OpenJPA
Issue Type: Bug
Components: osgi
Affects Versions: 2.0.1
Environment: apache-karaf 2.1.0, openjdk-1.6.0b18
Reporter: Wolfgang Glas
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
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.