[jboss-user] [Installation, Configuration & DEPLOYMENT] - Re: Overriding universal classloader, JBoss 4.2.1GA

jaikiran do-not-reply at jboss.com
Tue Oct 23 05:22:51 EDT 2007


"jimpo991" wrote : 
  | I still don't understand why all this results in a ClassCastException about FullTextIndexEventListener. If my war uses the hibernate jars from WEB-INF, and they don't contain org.hibernate.search package, where does the classcastexception come from?

Valid question. I hadn't completely got an answer to that yesterday so i had intentionally left out the explanation for the classcast from my earlier post. But now, after going through the Hibernate Annotations code and adding some log statements and enabling verbose class logging, i guess i understand what the issue is. Let me try to put it here. Let's consider the case where you did NOT place the hibernate-search.jar file in the WEB-INF/lib of your application:

1) Where in the code does this classcast occur- The name of the class where this happens is AnnotationConfiguration.java (which is part of the hibernate-annotationsxxx.jar). The lines of the code are (just copied the relevant part here - see the line marked in bold):

try {
  | 	searchEventListenerClass = ReflectHelper.classForName(
  | 			"org.hibernate.search.event.FullTextIndexEventListener",
  | 			AnnotationConfiguration.class );
  | 	
  | }
  | ...//some code here
  | PostInsertEventListener[] listeners = getEventListeners().getPostInsertEventListeners();
  | newListeners[length-1] = (PostInsertEventListener) searchEventListener;
  | ...//some more code here
  | 
  | 

So when the FullTextIndexEventListener is being cast to PostInsertEventListener, the classcast is being thrown. But looking at the FullTextIndexEventListener class definition, it infact does implement this interface:

public class FullTextIndexEventListener implements PostDeleteEventListener, PostInsertEventListener,
  | 		PostUpdateEventListener, Initializable {
  | 

As you have been wondering, since the FullTextIndexEventListener is available ONLY in the hibernate-annotations.jar file present in the server/lib folder, how could it be that the FullTextIndexEventListener be loaded by 2 different classloaders. A bit of verbose class logs revealed that it was not the FullTextIndexEventListener that was loaded by different classloaders. It  turned out that the PostInsertEventListener was being loaded by different classloaders. Here's the reason - The PostInsertEventListener is part of the hibernate (core) jar. The hibernate jar is present in the server/lib folder as well as the application's WEB-INF/lib folder. The  PostInsertEventListener  was once loaded by the application specific classloader. Then when the following code was executed

searchEventListenerClass = ReflectHelper.classForName(
  | 			"org.hibernate.search.event.FullTextIndexEventListener",
  | 			AnnotationConfiguration.class );

the FullTextIndexEventListener (present in hibernate-annotations.jar in server/lib) got loaded by the parent classloader since it was not present in your application's WEB-INF/lib folder. While loading this class, the server also loaded (again) the  PostInsertEventListener (remember the FullTextIndexEventListener implements this interface) , this time using the classloader which loaded FullTextIndexEventListener - which turns out to be the parent classloder (since the parent classloader was used, it picked up this interface from the hibernate3.jar present in the server/lib folder and not the hibernate-3.2.5.jar present in the WEB-INF/lib of your application). Ultimately, the PostInsertEventListener  was loaded by 2 different classloaders through the hibernate3.jar (in server/lib) and hibernate-3.2.5.jar (in WEB-INF/lib). This resulted in the classcast.

Adding the hibernate-search.jar to WEB-INF/lib solves the problem because, the FullTextIndexEventListener (and eventually the PostInsertEventListener ) will be loaded by the application specific classloader instead of the parent classloader.

Makes sense?

 

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

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



More information about the jboss-user mailing list