Hi Bengt, It sure sounds like you have narrowed down the problem. I would suggest opening a JIRA for this problem with the information you have provided and then "push" for it to be worked on... :-)
I'm also going to cross post to dev on the chance we could get some interest in developing a fix for this... Thanks, Kevin On Tue, Sep 6, 2011 at 2:43 PM, Bengt Rodehav <[email protected]> wrote: > Hello again, > > As I didn't get any replies on this post here on the OpenJPA forum I tried > on the Aries list since I thought the problem might lie in Aries JPA > container. I got the following reply from Timothy Ward: > > *"This sort of problem is usually caused by a JPA provider using the wrong > > classloader to try and find your class. If you import the > > se.digia.maia.common.auditlog.impl package into your persistence bundle > > *and* OpenJPA uses the Persistence Unit classloader (rather than its own) > to > > load it then everything should work fine. Realistically they should try > both > > their classloader and the persistence unit classloader in case the config > > property is for their own internals. > > Unfortunately there is a limit to how much Aries can shield JPA providers > > from OSGi classloading!"* > > > Looking at the stack trace it seems clear that OpenJPA tries to load my > Auditor implementation using its own class loader. Unless OpenJPA > dynamically imports "*" this won't work. OpenJPA needs to use the class > loader of the bundle containing the persistence.xml. In my case this will > work since that bundle does import the package containing my Auditor > implementation. > > Can someone on the OpenJPA team confirm this? Shalll I create a JIRA? > > /Bengt > > > 2011/9/4 Bengt Rodehav <[email protected]> > > > Hello everyone, > > > > After a long discussion about audit logging on this mailing list, Pinaki > > developed an audit logging facility that he describes on: > > > > > http://openjpa.208410.n2.nabble.com/OpenJPA-Audit-Facility-tc6722915.html > > > > It provides very interesting functionality and I've tried it in simple > > JUnit scenarios using RESOURCE_LOCAL and it seems to work fine. However, > my > > production environment nowadays is OSGi using Karaf+Felix. I use Aries > for > > transaction support and also for it's JPA support. In that environment, > > OpenJPA doesn't seem to be able to find my auditor implementation > > (se.digia.maia.common.auditlog.impl.MaiaAuditor) that I specify in my > > persistence.xml. > > > > Has anyone else tried OpenJPA's new audit log facility? How can I make > > OpenJPA find classes specified in the persistence.xml? I have > double-checked > > that the se.digia.maia.common.auditlog.impl is exported from my > implementing > > bundle. > > > > I get the following exception: > > > > *ERROR: Bundle org.apache.aries.jpa.container [21] EventDispatcher: Error > >> during dispatch. (<openjpa-2.2.0-SNAPSHOT-runknown fatal user error> > >> org.apache.openjpa.persistence.ArgumentException: Could not invoke the > >> static newInstance method on the named factory class > >> "org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory".) > >> <openjpa-2.2.0-SNAPSHOT-runknown fatal user error> > >> org.apache.openjpa.persistence.ArgumentException: Could not invoke the > >> static newInstance method on the named factory class > >> "org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory". > >> at > >> org.apache.openjpa.kernel.Bootstrap.newBrokerFactory(Bootstrap.java:76) > >> at > >> > org.apache.openjpa.persistence.PersistenceProviderImpl.getBrokerFactory(PersistenceProviderImpl.java:147) > >> at > >> > org.apache.openjpa.persistence.PersistenceProviderImpl.createContainerEntityManagerFactory(PersistenceProviderImpl.java:185) > >> at > >> > org.apache.openjpa.persistence.PersistenceProviderImpl.createContainerEntityManagerFactory(PersistenceProviderImpl.java:62) > >> at > >> > org.apache.aries.jpa.container.impl.EntityManagerFactoryManager.createEntityManagerFactories(EntityManagerFactoryManager.java:263) > >> at > >> > org.apache.aries.jpa.container.impl.EntityManagerFactoryManager.bundleStateChange(EntityManagerFactoryManager.java:153) > >> at > >> > org.apache.aries.jpa.container.impl.PersistenceBundleManager.modifiedBundle(PersistenceBundleManager.java:283) > >> at > >> > org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:453) > >> at > org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:237) > >> at > >> > org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:413) > >> at > >> > org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:807) > >> at > >> > org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:729) > >> at > >> > org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:610) > >> at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:3879) > >> at org.apache.felix.framework.Felix.access$800(Felix.java:79) > >> at > >> > org.apache.felix.framework.Felix$StatefulResolver.fireResolvedEvents(Felix.java:4491) > >> at > >> > org.apache.felix.framework.Felix$StatefulResolver.resolve(Felix.java:4162) > >> at org.apache.felix.framework.Felix.resolveBundle(Felix.java:3557) > >> at org.apache.felix.framework.Felix.startBundle(Felix.java:1797) > >> at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1192) > >> at > >> org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:266) > >> at java.lang.Thread.run(Thread.java:662) > >> Caused by: org.apache.openjpa.lib.util.ParseException: Instantiation of > >> plugin "Auditor" with value > "se.digia.maia.common.auditlog.impl.MaiaAuditor" > >> caused an error "java.lang.IllegalArgumentException: > >> java.lang.ClassNotFoundException: > >> se.digia.maia.common.auditlog.impl.MaiaAuditor". The alias or class name > may > >> have been misspelled, or the class may not have be available in the > class > >> path. Valid aliases for this plugin are: [default] > >> at > >> > org.apache.openjpa.lib.conf.Configurations.getCreateException(Configurations.java:409) > >> at > >> > org.apache.openjpa.lib.conf.Configurations.newInstance(Configurations.java:219) > >> at > >> > org.apache.openjpa.lib.conf.ObjectValue.newInstance(ObjectValue.java:124) > >> at > >> > org.apache.openjpa.lib.conf.PluginValue.instantiate(PluginValue.java:103) > >> at > >> org.apache.openjpa.lib.conf.ObjectValue.instantiate(ObjectValue.java:83) > >> at > >> > org.apache.openjpa.conf.OpenJPAConfigurationImpl.getAuditorInstance(OpenJPAConfigurationImpl.java:1822) > >> at > >> > org.apache.openjpa.kernel.AbstractBrokerFactory.postCreationCallback(AbstractBrokerFactory.java:854) > >> at > >> > org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.postCreationCallback(JDBCBrokerFactory.java:105) > >> at > >> org.apache.openjpa.kernel.Bootstrap.newBrokerFactory(Bootstrap.java:67) > >> ... 21 more > >> Caused by: java.lang.IllegalArgumentException: > >> java.lang.ClassNotFoundException: > >> se.digia.maia.common.auditlog.impl.MaiaAuditor > >> at serp.util.Strings.toClass(Strings.java:164) > >> at serp.util.Strings.toClass(Strings.java:108) > >> at > >> > org.apache.openjpa.lib.conf.Configurations.newInstance(Configurations.java:211) > >> ... 28 more* > > > > > > /Bengt > > > > >
