ClassCastException very strange

Hello i make the following thinks on websphere 5.1 :

=========================================

INTERFACE

=========================================

public interface DetailCommandeInterface {

public HashMap getDetailCommandes(String[] numerosDossier);

}

=========================================

IMPLEMENTATION ( a singleton )

=========================================

public class DetailCommandeImpl implements DetailCommandeInterface

{

private static DetailCommandeImpl detailcmd;

private DetailCommandeImpl()

{

}

public static DetailCommandeImpl getInstance()

{

if (detailcmd == null)

detailcmd = new DetailCommandeImpl();

return detailcmd;

}

public HashMap getDetailCommandes(String[] numerosDossier) {

return new HashMap();

}

}

=========================================

I've got one ear.

One servlet, in one war of that ear do that on the init :

getServletContext().getContext(IExt.CTX_BOUTIQUE).setAttribute("detailCommande", DetailCommandeImpl.getInstance()) ;

A second servlet, in another war, does that :

DetailCommandeInterface interf = (DetailCommandeInterface)(getServletContext().getContext(IExt.CTX_BOUTIQUE).getAttribute("detailCommande"));

I get this error :

message: fr.laser.boutique.service.externe.impl.DetailCommandeImpl

classe: class java.lang.ClassCastException

Any ideas ?

[1514 byte] By [grazius69a] at [2007-11-26 14:28:16]
# 1

Probably a classloader issue. Right before you do the cast, print out the class of the object (or look at it in a debugger). If the classname is exactly what you expect--including package name and capitalization--then it's definitely a classloader issue.

I don't know about websphere's class loading, so you'll have to look at its docs or forum for details there. The short version is that if the same class is loaded by two different classloaders, then it's not the same class. You'll need to make sure that class is in ONE place where it can be picked up by all the classloaders that need it.

jverda at 2007-7-8 2:22:14 > top of Java-index,Java Essentials,Java Programming...
# 2

Piggybacking on what jverd said, you should look at the classloader and class name of both the source (what the object actually is) and target (the class you're trying to cast it to).

Object o = getServletContext().getContext(IExt.CTX_BOUTIQUE).getAttribute("detailCommande");

Class c = o.getClass(); // assuming o isn't null here

System.out.println("Actual class: " + c + ", loaded from " + c.getClassLoader());

c = DetailCommandeInterface.class;

System.out.println("Desired class: " + c + "; loaded from " + c.getClassLoader());

warnerjaa at 2007-7-8 2:22:14 > top of Java-index,Java Essentials,Java Programming...
# 3
jverd , thanks that right ...The classloader between my two war are in conflict ( the same interface ).I've pushed my interface in a jar that loaded with the ear and delete it of my two war and now this work fine.Thanks ;]
grazius69a at 2007-7-8 2:22:14 > top of Java-index,Java Essentials,Java Programming...