"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
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user