[jboss-user] [JCA/JBoss] - Classloading issue either with JMS inflow, TM, or Hibernate

genman do-not-reply at jboss.com
Thu Jul 26 16:48:18 EDT 2007


Issue with JBoss 4.2.0

Hibernate can't seem to find my class when it does a commit from a MDB. It seems Hibernate doesn't know the classloader, and 

The way to reproduce this is to create an EJB3 entity with a Serializable field, modify that field in an MDB, and you get this:


  | 2007-07-25 11:14:41,313 ERROR [AbstractFlushingEventListener] Could not synchronize database state with session
  | org.hibernate.type.SerializationException: could not deserialize
  | at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:214)
  | at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:240)
  | at org.hibernate.type.SerializableType.fromBytes(SerializableType.java:82)
  | at org.hibernate.type.SerializableType.deepCopyNotNull(SerializableType.java:74)
  | at org.hibernate.type.MutableType.deepCopy(MutableType.java:25)
  | at org.hibernate.type.SerializableToBlobType.deepCopy(SerializableToBlobType.java:102)
  | at org.hibernate.type.TypeFactory.deepCopy(TypeFactory.java:353)
  | at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:114)
  | at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
  | at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
  | at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
  | at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
  | at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
  | at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
  | at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
  | at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:515)
  | at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:114)
  | at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:249)
  | at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:88)
  | at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:177)
  | at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1256)
  | at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:135)
  | at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:87)
  | at org.jboss.resource.adapter.jms.inflow.JmsServerSession$XATransactionDemarcationStrategy.end(JmsServerSession.java:494)
  | at org.jboss.resource.adapter.jms.inflow.JmsServerSession.run(JmsServerSession.java:248)
  | at org.jboss.resource.work.WorkWrapper.execute(WorkWrapper.java:204)
  | at org.jboss.util.threadpool.BasicTaskWrapper.run(BasicTaskWrapper.java:275)
  | at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:743)
  | at java.lang.Thread.run(Thread.java:595)
  | Caused by: java.lang.ClassNotFoundException: No ClassLoaders found for: com.example.msg.Message
  | at org.jboss.mx.loading.LoadMgr3.beginLoadTask(LoadMgr3.java:306)
  | at org.jboss.mx.loading.RepositoryClassLoader.loadClassImpl(RepositoryClassLoader.java:514)
  | at org.jboss.mx.loading.RepositoryClassLoader.loadClass(RepositoryClassLoader.java:408)
  | at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
  | at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
  | at java.lang.Class.forName0(Native Method)
  | at java.lang.Class.forName(Class.java:242)
  | at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:574)
  | at org.hibernate.util.SerializationHelper$CustomObjectInputStream.resolveClass(SerializationHelper.java:268)
  | at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1538)
  | at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1460)
  | at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693)
  | at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
  | at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
  | at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:210)
  | ... 28 more
  | 

Looks like serialization expects the context classloader to be set correctly for the calling thread:


  | 
  | public final class SerializationHelper {
  | ...
  | 	/**
  | 	 * Custom ObjectInputStream implementation to more appropriately handle classloading
  | 	 * within app servers (mainly jboss - hence this class inspired by jboss's class of
  | 	 * the same purpose).
  | 	 */
  | 	private static final class CustomObjectInputStream extends ObjectInputStream {
  | 			ClassLoader loader = Thread.currentThread().getContextClassLoader();
  | 
  | 

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4068010#4068010

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4068010



More information about the jboss-user mailing list