cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Simone Gianni <s.gia...@thebug.it>
Subject Re: ClassCastException becuase of different classloaders for a bean weaving by springframework
Date Fri, 22 Sep 2006 11:18:16 GMT
Hi Rice,
yep, I noticed that too, jetty6:run builds the classpath reading from 
the pom.xml, but actually this should not be "important", because this 
classpath is then reloaded by the cocoon classloader which is a 
child-first, so falls back on the jetty6:run created classpath only if 
it cannot find a class.

I'm currently loading some beans with spring from different jars and not 
having this problem, as long as all classes are there. Problems arise 
when you try to use JRE classes or other shared libraries not loaded by 
the cocoon classloader.

You should check the classloader of xs.school.Platform, this is because 
when you declare a method, say doSomethingWith(MyObject o) in class 
MyClass, argument and return classes are resolved on the current class 
classloader, so the method will be 
doSomethingWith(MyObject-LoadedByMyClassClassloader o), and it will 
complain if you try to invoke 
MyClass.doSomethingWith(MyObject-LoadedFromAnotherClassloader). Is 
xs.school.Platform in WEB-INF/cocoon/lib as well? Loaded by the cocoon 
classloader?

How do you discovered which classloader was loading a certain class? I'm 
asking because i noticed that Eclipse is a bit buggy in these field. The 
best way I've found so far is to put a static block printing out "Class 
X loaded by XXX".

Hope this helps,
Simone


Rice Yeh wrote:
> Seems jetty6:run will automatically add all dependences in pom.xml to 
> WEB-INF/lib. I get the following information by passing -X to mvn command.
>
> [INFO] Context path = /
> [DEBUG] Adding artifact hibernate-3.2.0.cr2.jar for WEB-INF/lib
> [DEBUG] Adding artifact jakarta-bcel-20040329.jar for WEB-INF/lib
> [DEBUG] Adding artifact excalibur-logger-2.1.jar for WEB-INF/lib
> [DEBUG] Adding artifact commons-logging-1.0.4.jar for WEB-INF/lib
> [DEBUG] Adding artifact xs-persistence-hibernate-1.0-SNAPSHOT.jar for 
> WEB-INF/lib
> ....
>
> On 9/20/06, *Rice Yeh* < riceyeh@gmail.com <mailto:riceyeh@gmail.com>> 
> wrote:
>
>     Hi,
>       I have a bean created thru. springframeowrk in cocoon. The bean
>     needs 3 arguments in its contructor to create it as below:
>
>         <bean id="platform" class="xs.school.Platform" scope="singleton">
>             <constructor-arg type="java.lang.String" value="development"/>
>             <constructor-arg type="xs.persistence.Adapter"
>     ref="persistenceAdapter"/>
>             <constructor-arg type=" java.util.Locale"><util:constant
>     static-field="java.util.Locale.TAIWAN"/></constructor-arg>
>         </bean>
>
>         <bean id="persistenceAdapter"
>     class="xs.selection.HibernateAdapter ">
>             <property name="settings" value="hibernate.cfg.xml"/>
>         </bean>
>
>     I find xs.persistence.Adapter 's (which is an interface)
>     classloader is WebAppClassLoader. The real adapter implemenation
>     is called HibernateAdapter whose classloader is
>     DefaultClassLoader. So a ClassCastException is thrown when
>     assigning the instance of HibernateAdapter (which implements
>     Adapter, surely) to the second argument shown beflow. Adapter and
>     HibernateAdapter are in two different jars but both are in
>     WEB-INF/cocoon/lib. Should not all classes in jars under
>     WEB-INF/cocoon/lib loaded by the same classloader
>     (DefaultClassLoader)?
>
>     Caused by:
>     org.springframework.beans.factory.UnsatisfiedDependencyException: Err
>     or creating bean with name 'platform' defined in URL
>     [file:C:/tmp/cocoon/xs-scho
>     ol-cocoon/src/main/resources/META-INF/spring/application.xml]:
>     Unsatisfied depen
>     dency expressed through constructor argument with index 1 of type
>     [xs.persistenc
>     e.Adapter]: Could not convert constructor argument value
>     [xs.selection.Hibernate
>     Adapter@779f5e] to required type [xs.persistence.Adapter ]: Failed
>     to convert val
>     ue of type [xs.selection.HibernateAdapter] to required type
>     [xs.persistence.Adap
>     ter]; nested exception is java.lang.IllegalArgumentException: No
>     matching editor
>     s or conversion strategy found
>             at
>     org.springframework.beans.factory.support.ConstructorResolver.createA
>     rgumentArray(ConstructorResolver.java:375)
>             at
>     org.springframework.beans.factory.support.ConstructorResolver.autowir
>     eConstructor( ConstructorResolver.java:126)
>             at
>     org.springframework.beans.factory.support.AbstractAutowireCapableBean
>     Factory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:548)
>             at
>     org.springframework.beans.factory.support.AbstractAutowireCapableBean
>     Factory.createBean(AbstractAutowireCapableBeanFactory.java:352)
>             at
>     org.springframework.beans.factory.support.AbstractBeanFactory$1.getOb
>     ject(AbstractBeanFactory.java:240)
>             at
>     org.springframework.beans.factory.support.DefaultSingletonBeanRegistr
>     y.getSingleton(DefaultSingletonBeanRegistry.java:132)
>             at
>     org.springframework.beans.factory.support.AbstractBeanFactory.getBean
>     (AbstractBeanFactory.java:237)
>             at
>     org.springframework.beans.factory.support.AbstractBeanFactory.getBean
>     (AbstractBeanFactory.java:153)
>             at
>     org.springframework.beans.factory.support.DefaultListableBeanFactory.
>     preInstantiateSingletons(DefaultListableBeanFactory.java:254)
>             at
>     org.springframework.context.support.AbstractApplicationContext.refres
>     h(AbstractApplicationContext.java:337)
>             at
>     org.springframework.web.context.support.AbstractRefreshableWebApplica
>     tionContext.refresh(AbstractRefreshableWebApplicationContext.java:156)
>             at
>     org.springframework.web.context.ContextLoader.createWebApplicationCon
>     text(ContextLoader.java:246)
>             at
>     org.springframework.web.context.ContextLoader.initWebApplicationConte
>     xt(ContextLoader.java:184)
>             at
>     org.springframework.web.context.ContextLoaderListener.contextInitiali
>     zed(ContextLoaderListener.java:49)
>             at
>     org.apache.cocoon.bootstrap.servlet.ShieldingListener.invoke(Shieldin
>     gListener.java:151)
>             ... 32 more
>
>
>     Rice
>
>

Mime
View raw message