You are viewing a plain text version of this content. The canonical link for it is here.
Posted to graffito-dev@incubator.apache.org by Daniel Mora <mo...@gmail.com> on 2006/04/19 02:11:05 UTC
Classloader problem
Hi all,
I am successfully integrating Graffito mapping tools into my J2EE CMS
environment. But now Im facing a classloader problem. The following code is
throwing a ClassCastException in (DefaultTipology) resultIter.next() because
DefaultTipology.class.getClassLoader() != resultIter.next
().getClass().getClassLoader()
One is LocalClassLoader and the other is WebAppClassLoader.
Filter filter = this.queryManager.createFilter(
DefaultTipology.class);
Query query = this.queryManager.createQuery(filter);
Collection result = this.persistenceManager.getObjects(query);
Iterator resultIter = result.iterator();
while(resultIter.hasNext()){
DefaultTipology defTipo = (DefaultTipology) resultIter.next();
this.tipologyIds.put(defTipo.getIdName(),defTipo);
}
Is there a way to set the classloader in graffito, in order to have only one
instance of a class?
Re: Classloader problem
Posted by Christophe Lombart <ch...@gmail.com>.
Daniel,
I'm still wondering why you are using a LocalClassLoader - just curious !
but I'm ok for your proposal.
Can you send me a patch ? By this way, it is easier to commit your
modifications.
Are you using Graffito OCM with Spring ?
Thanks,
Christophe
On 4/19/06, Daniel Mora <mo...@gmail.com> wrote:
>
> I found a solution and maybe can be a contribution to Graffito mapper. I
> modified a little some graffito mapping files (ReflectionUtils,
> FieldDescriptor, ManegeableCollectionUtil, ObjectConverterImpl) that use
> Class.forName. Now only ReflectionUtils calls Class.forName, the others
> use
> ReflectionUtils.forName. I added to ReflectionUtils a private static
> attribute called classLoader and its setter and getter. I also modified
> the
> Mapper interface and added
> public abstract void setClassLoader(ClassLoader classLoader);
> public abstract ClassLoader getClassLoader();
>
> Now I can do things like:
> Mapper mapper = new DigesterMapperImpl(this.files);
> mapper.setClassLoader(myClassLoader);
> mapper.buildMapper();
>
> And this is the ReflectionUtils file:
>
> package org.apache.portals.graffito.jcr.reflection;
>
> import java.lang.reflect.InvocationTargetException;
> import net.sf.cglib.proxy.Enhancer;
> import org.apache.commons.beanutils.ConstructorUtils;
> import org.apache.commons.beanutils.PropertyUtils;
> import org.apache.portals.graffito.jcr.exception.JcrMappingException;
> import
>
> org.apache.portals.graffito.jcr.persistence.collectionconverter.CollectionConverter
> ;
>
>
> /**
> * Utility class for handling reflection using BeanUtils.
> *
> * @author <a href='mailto:the_mindstorm[at]evolva[dot]ro'>Alexandru
> Popescu</a>
> */
> abstract public class ReflectionUtils {
>
> private static ClassLoader classLoader = null;
>
> public static Object getNestedProperty(Object object, String
> fieldName)
> {
> if (null == object) {
> return null;
> }
>
> try {
> return PropertyUtils.getNestedProperty(object, fieldName);
> }
> catch(IllegalAccessException e) {
> throw new JcrMappingException("Cannot access property "
> + fieldName,
> e);
> }
> catch(InvocationTargetException e) {
> throw new JcrMappingException("Cannot access property "
> + fieldName,
> e);
> }
> catch(NoSuchMethodException e) {
> throw new JcrMappingException("Cannot access property "
> + fieldName,
> e);
> }
> }
>
> public static Class getPropertyType(Object object, String fieldName) {
> try {
> return PropertyUtils.getPropertyType(object, fieldName);
> }
> catch(Exception ex) {
> throw new JcrMappingException("Cannot access property "
> + fieldName,
> ex);
> }
> }
>
> public static Object newInstance(Class clazz) {
> try {
> return clazz.newInstance();
> }
> catch(Exception ex) {
> throw new JcrMappingException("Cannot create instance for
> class
> "
> + clazz,
> ex);
> }
> }
>
> /**
> * @param className
> * @param objects
> * @return
> */
> public static CollectionConverter invokeConstructor(String className,
> Object[] params) {
> try {
>
> Class converterClass = ReflectionUtils.forName(className);
> return (CollectionConverter)
> ConstructorUtils.invokeConstructor(converterClass,
> params);
> }
> catch(Exception ex) {
> throw new JcrMappingException("Cannot create instance for
> class
> "
> + className,
> ex);
> }
> }
>
> /**
> * @param object
> * @param fieldName
> * @param path
> */
> public static void setNestedProperty(Object object, String fieldName,
> Object value) {
> try {
> PropertyUtils.setNestedProperty(object, fieldName, value);
> }
> catch(Exception ex) {
> throw new JcrMappingException("Cannot set the field " +
> fieldName + " in the class : " + object.getClass().toString(),
> ex);
> }
> }
>
> /**
> * @param string
> * @return
> */
> public static Object newInstance(String clazz) {
> try {
> return ReflectionUtils.forName(clazz).newInstance();
> }
> catch(Exception ex) {
> throw new JcrMappingException("Cannot create instance for
> class
> "
> + clazz,
> ex);
> }
> }
>
> /**
> * @param elementClassName
> * @return
> */
> public static Class forName(String clazz) throws JcrMappingException{
> try {
> Class aClass = null;
> if(ReflectionUtils.classLoader!=null){
> aClass = Class.forName(clazz,false,
> ReflectionUtils.classLoader);
> }
> if(aClass!=null){
> return aClass;
> }
>
> return Class.forName(clazz);
> }
> catch(Exception ex) {
> throw new JcrMappingException("Cannot load class " + clazz,
> ex);
> }
> }
>
> public static boolean isProxy(Class beanClass)
> {
> return Enhancer.isEnhanced(beanClass);
> }
>
> public static Class getBeanClass(Object bean)
> {
> Class beanClass = bean.getClass();
> if (isProxy(beanClass))
> {
> //CGLIB specific
> return beanClass.getSuperclass();
> }
> return beanClass;
> }
>
> public static ClassLoader getClassLoader() {
> return ReflectionUtils.classLoader;
> }
>
> public static void setClassLoader(ClassLoader classLoader) {
> ReflectionUtils.classLoader = classLoader;
> }
>
> }
>
>
> On 4/19/06, Daniel Mora <mo...@gmail.com> wrote:
> >
> > Yes, I am using Tomcat. The problem is that I have a custom classloader
> > called LocalClassLoader and is conflicting with WebAppClassloader, and
> both
> > are loading DefaultTipology.class from WEB-INF\classes.
> > I had the same problem using XStream, but XStream has the posibility to
> > set the classloader.
> > ClassLoader classLoader = DefaultTipology.class.getClassLoader
> ();
> > xstream.setClassLoader(classLoader);
> > The solution I am thinking is to modify some graffito files, for example
> > ReflectionUtils.java , and change Class.forName(className) into
> > Class.forName(className, classloader).
> > Maybe I can contribute with Graffito with this extra feature, what do
> you
> > think?
> >
> >
> >
> > On 4/19/06, Christophe Lombart <ch...@gmail.com> wrote:
> > >
> > > Graffito is a classic java application. So, classloader is working as
> > > usual.
> > > Can you give me more information on your deployement. How your jars
> are
> > > deployed ? Are you using Jetspeed ?
> > > Where is deployed DefaultTipology ? Are you using Tomcat ? I'm not
> sure
> > > it
> > > is necessary to set the classloader.
> > >
> > >
> > > On 4/19/06, Daniel Mora <mo...@gmail.com> wrote:
> > > >
> > > > Hi all,
> > > > I am successfully integrating Graffito mapping tools into my J2EE
> CMS
> > > > environment. But now Im facing a classloader problem. The following
> > > code
> > > > is
> > > > throwing a ClassCastException in (DefaultTipology) resultIter.next()
> > > > because
> > > > DefaultTipology.class.getClassLoader () != resultIter.next
> > > > ().getClass().getClassLoader()
> > > > One is LocalClassLoader and the other is WebAppClassLoader.
> > > >
> > > > Filter filter = this.queryManager.createFilter(
> > > > DefaultTipology.class );
> > > > Query query = this.queryManager.createQuery(filter);
> > > > Collection result = this.persistenceManager.getObjects
> > > (query);
> > > > Iterator resultIter = result.iterator();
> > > > while( resultIter.hasNext()){
> > > > DefaultTipology defTipo = (DefaultTipology)
> > > resultIter.next
> > > > ();
> > > > this.tipologyIds.put(defTipo.getIdName(),defTipo);
> > > > }
> > > >
> > > > Is there a way to set the classloader in graffito, in order to have
> > > only
> > > > one
> > > > instance of a class?
> > > >
> > > >
> > >
> > >
> > > --
> > > Best regards,
> > >
> > > Christophe
> > >
> > >
> >
>
>
--
Best regards,
Christophe
Re: Classloader problem
Posted by Alexandru Popescu <th...@gmail.com>.
This was exactly my initial attempt when externalizing all reflection
code to the ReflectionUtils class. Unfortunately, at that time I
couldn't make the change everywhere.
If you can submit the patch than me or Christophe will take a look at
it and commit it.
./alex
--
.w( the_mindstorm )p.
InfoQ.com Architect
On 4/19/06, Daniel Mora <mo...@gmail.com> wrote:
> I found a solution and maybe can be a contribution to Graffito mapper. I
> modified a little some graffito mapping files (ReflectionUtils,
> FieldDescriptor, ManegeableCollectionUtil, ObjectConverterImpl) that use
> Class.forName. Now only ReflectionUtils calls Class.forName, the others use
> ReflectionUtils.forName. I added to ReflectionUtils a private static
> attribute called classLoader and its setter and getter. I also modified the
> Mapper interface and added
> public abstract void setClassLoader(ClassLoader classLoader);
> public abstract ClassLoader getClassLoader();
>
> Now I can do things like:
> Mapper mapper = new DigesterMapperImpl(this.files);
> mapper.setClassLoader(myClassLoader);
> mapper.buildMapper();
>
> And this is the ReflectionUtils file:
>
> package org.apache.portals.graffito.jcr.reflection;
>
> import java.lang.reflect.InvocationTargetException;
> import net.sf.cglib.proxy.Enhancer;
> import org.apache.commons.beanutils.ConstructorUtils;
> import org.apache.commons.beanutils.PropertyUtils;
> import org.apache.portals.graffito.jcr.exception.JcrMappingException;
> import
> org.apache.portals.graffito.jcr.persistence.collectionconverter.CollectionConverter
> ;
>
>
> /**
> * Utility class for handling reflection using BeanUtils.
> *
> * @author <a href='mailto:the_mindstorm[at]evolva[dot]ro'>Alexandru
> Popescu</a>
> */
> abstract public class ReflectionUtils {
>
> private static ClassLoader classLoader = null;
>
> public static Object getNestedProperty(Object object, String fieldName)
> {
> if (null == object) {
> return null;
> }
>
> try {
> return PropertyUtils.getNestedProperty(object, fieldName);
> }
> catch(IllegalAccessException e) {
> throw new JcrMappingException("Cannot access property "
> + fieldName,
> e);
> }
> catch(InvocationTargetException e) {
> throw new JcrMappingException("Cannot access property "
> + fieldName,
> e);
> }
> catch(NoSuchMethodException e) {
> throw new JcrMappingException("Cannot access property "
> + fieldName,
> e);
> }
> }
>
> public static Class getPropertyType(Object object, String fieldName) {
> try {
> return PropertyUtils.getPropertyType(object, fieldName);
> }
> catch(Exception ex) {
> throw new JcrMappingException("Cannot access property "
> + fieldName,
> ex);
> }
> }
>
> public static Object newInstance(Class clazz) {
> try {
> return clazz.newInstance();
> }
> catch(Exception ex) {
> throw new JcrMappingException("Cannot create instance for class
> "
> + clazz,
> ex);
> }
> }
>
> /**
> * @param className
> * @param objects
> * @return
> */
> public static CollectionConverter invokeConstructor(String className,
> Object[] params) {
> try {
>
> Class converterClass = ReflectionUtils.forName(className);
> return (CollectionConverter)
> ConstructorUtils.invokeConstructor(converterClass,
> params);
> }
> catch(Exception ex) {
> throw new JcrMappingException("Cannot create instance for class
> "
> + className,
> ex);
> }
> }
>
> /**
> * @param object
> * @param fieldName
> * @param path
> */
> public static void setNestedProperty(Object object, String fieldName,
> Object value) {
> try {
> PropertyUtils.setNestedProperty(object, fieldName, value);
> }
> catch(Exception ex) {
> throw new JcrMappingException("Cannot set the field " +
> fieldName + " in the class : " + object.getClass().toString(),
> ex);
> }
> }
>
> /**
> * @param string
> * @return
> */
> public static Object newInstance(String clazz) {
> try {
> return ReflectionUtils.forName(clazz).newInstance();
> }
> catch(Exception ex) {
> throw new JcrMappingException("Cannot create instance for class
> "
> + clazz,
> ex);
> }
> }
>
> /**
> * @param elementClassName
> * @return
> */
> public static Class forName(String clazz) throws JcrMappingException{
> try {
> Class aClass = null;
> if(ReflectionUtils.classLoader!=null){
> aClass = Class.forName(clazz,false,
> ReflectionUtils.classLoader);
> }
> if(aClass!=null){
> return aClass;
> }
>
> return Class.forName(clazz);
> }
> catch(Exception ex) {
> throw new JcrMappingException("Cannot load class " + clazz, ex);
> }
> }
>
> public static boolean isProxy(Class beanClass)
> {
> return Enhancer.isEnhanced(beanClass);
> }
>
> public static Class getBeanClass(Object bean)
> {
> Class beanClass = bean.getClass();
> if (isProxy(beanClass))
> {
> //CGLIB specific
> return beanClass.getSuperclass();
> }
> return beanClass;
> }
>
> public static ClassLoader getClassLoader() {
> return ReflectionUtils.classLoader;
> }
>
> public static void setClassLoader(ClassLoader classLoader) {
> ReflectionUtils.classLoader = classLoader;
> }
>
> }
>
>
> On 4/19/06, Daniel Mora <mo...@gmail.com> wrote:
> >
> > Yes, I am using Tomcat. The problem is that I have a custom classloader
> > called LocalClassLoader and is conflicting with WebAppClassloader, and both
> > are loading DefaultTipology.class from WEB-INF\classes.
> > I had the same problem using XStream, but XStream has the posibility to
> > set the classloader.
> > ClassLoader classLoader = DefaultTipology.class.getClassLoader();
> > xstream.setClassLoader(classLoader);
> > The solution I am thinking is to modify some graffito files, for example
> > ReflectionUtils.java , and change Class.forName(className) into
> > Class.forName(className, classloader).
> > Maybe I can contribute with Graffito with this extra feature, what do you
> > think?
> >
> >
> >
> > On 4/19/06, Christophe Lombart <ch...@gmail.com> wrote:
> > >
> > > Graffito is a classic java application. So, classloader is working as
> > > usual.
> > > Can you give me more information on your deployement. How your jars are
> > > deployed ? Are you using Jetspeed ?
> > > Where is deployed DefaultTipology ? Are you using Tomcat ? I'm not sure
> > > it
> > > is necessary to set the classloader.
> > >
> > >
> > > On 4/19/06, Daniel Mora <mo...@gmail.com> wrote:
> > > >
> > > > Hi all,
> > > > I am successfully integrating Graffito mapping tools into my J2EE CMS
> > > > environment. But now Im facing a classloader problem. The following
> > > code
> > > > is
> > > > throwing a ClassCastException in (DefaultTipology) resultIter.next()
> > > > because
> > > > DefaultTipology.class.getClassLoader () != resultIter.next
> > > > ().getClass().getClassLoader()
> > > > One is LocalClassLoader and the other is WebAppClassLoader.
> > > >
> > > > Filter filter = this.queryManager.createFilter(
> > > > DefaultTipology.class );
> > > > Query query = this.queryManager.createQuery(filter);
> > > > Collection result = this.persistenceManager.getObjects
> > > (query);
> > > > Iterator resultIter = result.iterator();
> > > > while( resultIter.hasNext()){
> > > > DefaultTipology defTipo = (DefaultTipology)
> > > resultIter.next
> > > > ();
> > > > this.tipologyIds.put(defTipo.getIdName(),defTipo);
> > > > }
> > > >
> > > > Is there a way to set the classloader in graffito, in order to have
> > > only
> > > > one
> > > > instance of a class?
> > > >
> > > >
> > >
> > >
> > > --
> > > Best regards,
> > >
> > > Christophe
> > >
> > >
> >
>
>
Re: Classloader problem
Posted by Daniel Mora <mo...@gmail.com>.
I found a solution and maybe can be a contribution to Graffito mapper. I
modified a little some graffito mapping files (ReflectionUtils,
FieldDescriptor, ManegeableCollectionUtil, ObjectConverterImpl) that use
Class.forName. Now only ReflectionUtils calls Class.forName, the others use
ReflectionUtils.forName. I added to ReflectionUtils a private static
attribute called classLoader and its setter and getter. I also modified the
Mapper interface and added
public abstract void setClassLoader(ClassLoader classLoader);
public abstract ClassLoader getClassLoader();
Now I can do things like:
Mapper mapper = new DigesterMapperImpl(this.files);
mapper.setClassLoader(myClassLoader);
mapper.buildMapper();
And this is the ReflectionUtils file:
package org.apache.portals.graffito.jcr.reflection;
import java.lang.reflect.InvocationTargetException;
import net.sf.cglib.proxy.Enhancer;
import org.apache.commons.beanutils.ConstructorUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.portals.graffito.jcr.exception.JcrMappingException;
import
org.apache.portals.graffito.jcr.persistence.collectionconverter.CollectionConverter
;
/**
* Utility class for handling reflection using BeanUtils.
*
* @author <a href='mailto:the_mindstorm[at]evolva[dot]ro'>Alexandru
Popescu</a>
*/
abstract public class ReflectionUtils {
private static ClassLoader classLoader = null;
public static Object getNestedProperty(Object object, String fieldName)
{
if (null == object) {
return null;
}
try {
return PropertyUtils.getNestedProperty(object, fieldName);
}
catch(IllegalAccessException e) {
throw new JcrMappingException("Cannot access property "
+ fieldName,
e);
}
catch(InvocationTargetException e) {
throw new JcrMappingException("Cannot access property "
+ fieldName,
e);
}
catch(NoSuchMethodException e) {
throw new JcrMappingException("Cannot access property "
+ fieldName,
e);
}
}
public static Class getPropertyType(Object object, String fieldName) {
try {
return PropertyUtils.getPropertyType(object, fieldName);
}
catch(Exception ex) {
throw new JcrMappingException("Cannot access property "
+ fieldName,
ex);
}
}
public static Object newInstance(Class clazz) {
try {
return clazz.newInstance();
}
catch(Exception ex) {
throw new JcrMappingException("Cannot create instance for class
"
+ clazz,
ex);
}
}
/**
* @param className
* @param objects
* @return
*/
public static CollectionConverter invokeConstructor(String className,
Object[] params) {
try {
Class converterClass = ReflectionUtils.forName(className);
return (CollectionConverter)
ConstructorUtils.invokeConstructor(converterClass,
params);
}
catch(Exception ex) {
throw new JcrMappingException("Cannot create instance for class
"
+ className,
ex);
}
}
/**
* @param object
* @param fieldName
* @param path
*/
public static void setNestedProperty(Object object, String fieldName,
Object value) {
try {
PropertyUtils.setNestedProperty(object, fieldName, value);
}
catch(Exception ex) {
throw new JcrMappingException("Cannot set the field " +
fieldName + " in the class : " + object.getClass().toString(),
ex);
}
}
/**
* @param string
* @return
*/
public static Object newInstance(String clazz) {
try {
return ReflectionUtils.forName(clazz).newInstance();
}
catch(Exception ex) {
throw new JcrMappingException("Cannot create instance for class
"
+ clazz,
ex);
}
}
/**
* @param elementClassName
* @return
*/
public static Class forName(String clazz) throws JcrMappingException{
try {
Class aClass = null;
if(ReflectionUtils.classLoader!=null){
aClass = Class.forName(clazz,false,
ReflectionUtils.classLoader);
}
if(aClass!=null){
return aClass;
}
return Class.forName(clazz);
}
catch(Exception ex) {
throw new JcrMappingException("Cannot load class " + clazz, ex);
}
}
public static boolean isProxy(Class beanClass)
{
return Enhancer.isEnhanced(beanClass);
}
public static Class getBeanClass(Object bean)
{
Class beanClass = bean.getClass();
if (isProxy(beanClass))
{
//CGLIB specific
return beanClass.getSuperclass();
}
return beanClass;
}
public static ClassLoader getClassLoader() {
return ReflectionUtils.classLoader;
}
public static void setClassLoader(ClassLoader classLoader) {
ReflectionUtils.classLoader = classLoader;
}
}
On 4/19/06, Daniel Mora <mo...@gmail.com> wrote:
>
> Yes, I am using Tomcat. The problem is that I have a custom classloader
> called LocalClassLoader and is conflicting with WebAppClassloader, and both
> are loading DefaultTipology.class from WEB-INF\classes.
> I had the same problem using XStream, but XStream has the posibility to
> set the classloader.
> ClassLoader classLoader = DefaultTipology.class.getClassLoader();
> xstream.setClassLoader(classLoader);
> The solution I am thinking is to modify some graffito files, for example
> ReflectionUtils.java , and change Class.forName(className) into
> Class.forName(className, classloader).
> Maybe I can contribute with Graffito with this extra feature, what do you
> think?
>
>
>
> On 4/19/06, Christophe Lombart <ch...@gmail.com> wrote:
> >
> > Graffito is a classic java application. So, classloader is working as
> > usual.
> > Can you give me more information on your deployement. How your jars are
> > deployed ? Are you using Jetspeed ?
> > Where is deployed DefaultTipology ? Are you using Tomcat ? I'm not sure
> > it
> > is necessary to set the classloader.
> >
> >
> > On 4/19/06, Daniel Mora <mo...@gmail.com> wrote:
> > >
> > > Hi all,
> > > I am successfully integrating Graffito mapping tools into my J2EE CMS
> > > environment. But now Im facing a classloader problem. The following
> > code
> > > is
> > > throwing a ClassCastException in (DefaultTipology) resultIter.next()
> > > because
> > > DefaultTipology.class.getClassLoader () != resultIter.next
> > > ().getClass().getClassLoader()
> > > One is LocalClassLoader and the other is WebAppClassLoader.
> > >
> > > Filter filter = this.queryManager.createFilter(
> > > DefaultTipology.class );
> > > Query query = this.queryManager.createQuery(filter);
> > > Collection result = this.persistenceManager.getObjects
> > (query);
> > > Iterator resultIter = result.iterator();
> > > while( resultIter.hasNext()){
> > > DefaultTipology defTipo = (DefaultTipology)
> > resultIter.next
> > > ();
> > > this.tipologyIds.put(defTipo.getIdName(),defTipo);
> > > }
> > >
> > > Is there a way to set the classloader in graffito, in order to have
> > only
> > > one
> > > instance of a class?
> > >
> > >
> >
> >
> > --
> > Best regards,
> >
> > Christophe
> >
> >
>
Re: Classloader problem
Posted by Daniel Mora <mo...@gmail.com>.
Yes, I am using Tomcat. The problem is that I have a custom classloader
called LocalClassLoader and is conflicting with WebAppClassloader, and both
are loading DefaultTipology.class from WEB-INF\classes.
I had the same problem using XStream, but XStream has the posibility to set
the classloader.
ClassLoader classLoader = DefaultTipology.class.getClassLoader();
xstream.setClassLoader(classLoader);
The solution I am thinking is to modify some graffito files, for example
ReflectionUtils.java , and change Class.forName(className) into
Class.forName(className, classloader).
Maybe I can contribute with Graffito with this extra feature, what do you
think?
On 4/19/06, Christophe Lombart <ch...@gmail.com> wrote:
>
> Graffito is a classic java application. So, classloader is working as
> usual.
> Can you give me more information on your deployement. How your jars are
> deployed ? Are you using Jetspeed ?
> Where is deployed DefaultTipology ? Are you using Tomcat ? I'm not sure it
> is necessary to set the classloader.
>
>
> On 4/19/06, Daniel Mora <mo...@gmail.com> wrote:
> >
> > Hi all,
> > I am successfully integrating Graffito mapping tools into my J2EE CMS
> > environment. But now Im facing a classloader problem. The following code
> > is
> > throwing a ClassCastException in (DefaultTipology) resultIter.next()
> > because
> > DefaultTipology.class.getClassLoader() != resultIter.next
> > ().getClass().getClassLoader()
> > One is LocalClassLoader and the other is WebAppClassLoader.
> >
> > Filter filter = this.queryManager.createFilter(
> > DefaultTipology.class);
> > Query query = this.queryManager.createQuery(filter);
> > Collection result = this.persistenceManager.getObjects(query);
> > Iterator resultIter = result.iterator();
> > while(resultIter.hasNext()){
> > DefaultTipology defTipo = (DefaultTipology)
> resultIter.next
> > ();
> > this.tipologyIds.put(defTipo.getIdName(),defTipo);
> > }
> >
> > Is there a way to set the classloader in graffito, in order to have only
> > one
> > instance of a class?
> >
> >
>
>
> --
> Best regards,
>
> Christophe
>
>
Re: Classloader problem
Posted by Christophe Lombart <ch...@gmail.com>.
Graffito is a classic java application. So, classloader is working as usual.
Can you give me more information on your deployement. How your jars are
deployed ? Are you using Jetspeed ?
Where is deployed DefaultTipology ? Are you using Tomcat ? I'm not sure it
is necessary to set the classloader.
On 4/19/06, Daniel Mora <mo...@gmail.com> wrote:
>
> Hi all,
> I am successfully integrating Graffito mapping tools into my J2EE CMS
> environment. But now Im facing a classloader problem. The following code
> is
> throwing a ClassCastException in (DefaultTipology) resultIter.next()
> because
> DefaultTipology.class.getClassLoader() != resultIter.next
> ().getClass().getClassLoader()
> One is LocalClassLoader and the other is WebAppClassLoader.
>
> Filter filter = this.queryManager.createFilter(
> DefaultTipology.class);
> Query query = this.queryManager.createQuery(filter);
> Collection result = this.persistenceManager.getObjects(query);
> Iterator resultIter = result.iterator();
> while(resultIter.hasNext()){
> DefaultTipology defTipo = (DefaultTipology) resultIter.next
> ();
> this.tipologyIds.put(defTipo.getIdName(),defTipo);
> }
>
> Is there a way to set the classloader in graffito, in order to have only
> one
> instance of a class?
>
>
--
Best regards,
Christophe