Interface xyz is not visible from class loader

Hello,

I have some Spring webapp that uses a controller to access some service object within a shared lib in Tomat. The shared lib provides service classes that are transactionized with Hibernate's TransactionManager. However, when trying to persist some Hibernate entity I get the following exception. I guess it is a reflection concern so I posted this topic here since in the hibernate forums I don't get any answer:

java.lang.IllegalArgumentException:interface org.hibernate.jdbc.ConnectionWrapper is not visible fromclass loader

java.lang.reflect.Proxy.getProxyClass(Proxy.java:353)

java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581)

org.hibernate.jdbc.BorrowedConnectionProxy.generateProxy(BorrowedConnectionProxy.java:67)

org.hibernate.jdbc.ConnectionManager.borrowConnection(ConnectionManager.java:163)

org.hibernate.jdbc.JDBCContext.borrowConnection(JDBCContext.java:111)

org.hibernate.impl.SessionImpl.connection(SessionImpl.java:359)

org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:456)

org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:349)

org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:259)

org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:102)

org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:161)

org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:203)

$Proxy2.create(Unknown Source)

test.TestController.handleRequest(TestController.java:39)

org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)

org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:839)

org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:774)

org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:460)

org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:415)

javax.servlet.http.HttpServlet.service(HttpServlet.java:690)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

I tried to share the lib that contains that Hibernate interface "ConnectionWrapper" (it is within the core hibernate3.jar file). But the xception remains the same.

Anyone an idea how to solve this problem?

[2758 byte] By [rapthora] at [2007-11-27 8:52:59]
# 1

What I tried is to have both of my webapps using an extended ContextListener. Both set the current Thread's ClassLoader the one the webapp owns.

But this approach does not work for me. I still get that Exception.

public class FirstWebappContextListener extends org.springframework.web.context.ContextLoaderListener {

@Override

public void contextInitialized(ServletContextEvent evt) {

ClassLoader contextLoader = Thread.currentThread().getContextClassLoader();

Thread.currentThread().setContextClassLoader(getClass().getClassLoader());

super.contextInitialized(evt);

Thread.currentThread().setContextClassLoader(contextLoader);

}

@Override

public void contextDestroyed(ServletContextEvent evt) {

ClassLoader contextLoader = Thread.currentThread().getContextClassLoader();

Thread.currentThread().setContextClassLoader(getClass().getClassLoader());

super.contextDestroyed(evt);

evt.getServletContext().removeAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

Thread.currentThread().setContextClassLoader(contextLoader);

}

}

public class SecondWebappContextListener extends org.springframework.web.context.ContextLoaderListener {

@Override

public void contextInitialized(ServletContextEvent evt) {

ClassLoader contextLoader = Thread.currentThread().getContextClassLoader();

Thread.currentThread().setContextClassLoader(getClass().getClassLoader());

super.contextInitialized(evt);

Thread.currentThread().setContextClassLoader(contextLoader);

}

@Override

public void contextDestroyed(ServletContextEvent evt) {

ClassLoader contextLoader = Thread.currentThread().getContextClassLoader();

Thread.currentThread().setContextClassLoader(getClass().getClassLoader());

super.contextDestroyed(evt);

evt.getServletContext().removeAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

Thread.currentThread().setContextClassLoader(contextLoader);

}

}

EDIT: This seems to be a ClassLoader/Tomcat-question rather than a Reflection topic. May be a moderator can move this thread.

Message was edited by:

rapthor

rapthora at 2007-7-12 21:09:35 > top of Java-index,Core,Core APIs...
# 2
No class loader experts?
rapthora at 2007-7-12 21:09:35 > top of Java-index,Core,Core APIs...