OVH Cloud OVH Cloud

ClassCastException incompréhensible

6 réponses
Avatar
LR
Salut,

Je n'arrive pas à me débarrasser d'un ClassCastException...
J'ai un projet dans lequel j'ai une classe Communicator implémentant une
interface d'un autre projet : ModuleCommunicator.

Dans un troisième projet, j'ai un paramètre de context (tomcat) initialisé
dans le premier projet par une instance de Communicator.
Dans mon troisième projet, j'essaie de récupérer cette instance et de la
caster en ModuleCommunicator. Ca devrait être possible vu que Communicator
implémente ModuleCommunicator.

Voici mon code qui lance "java.lang.ClassCastException:
org.lr.mydata.modules.Communicator" à la dernière ligne :
Object o =
getServlet().getServletContext().getAttribute("moduleCommunicator");
System.out.println( " context-param moduleCommunicator = " +o );
System.out.println( " class = " +o.getClass() );
System.out.println( " canonicalname = "
+o.getClass().getCanonicalName() );
System.out.println( " superclass = " +o.getClass().getSuperclass() );
System.out.println( " interface = " +o.getClass().getInterfaces()[0] );
System.out.println( " Communicator instance of ModuleCommunicator : " +(o
instanceof ModuleCommunicator) );
ModuleCommunicator communicator =
(ModuleCommunicator)getServlet().getServletContext().getAttribute("moduleCommunicator");

Et voici la sortie :
context-param moduleCommunicator = org.lr.mydata.modules.Communicator@33f0de
class = class org.lr.mydata.modules.Communicator
canonicalname = org.lr.mydata.modules.Communicator
superclass = class java.lang.Object
interface = interface org.lr.mydata.utils.ModuleCommunicator
Communicator instance of ModuleCommunicator : false

Alors d'où peut venir le problème, je suis aveugle ou quoi ????

Merci d'avance
Lilian

6 réponses

Avatar
Isammoc
Et voici la sortie :
context-param moduleCommunicator > class = class
org.lr.mydata.modules.Communicator canonicalname > org.lr.mydata.modules.Communicator superclass = class java.lang.Object
interface = interface org.lr.mydata.utils.ModuleCommunicator
Communicator instance of ModuleCommunicator : false

Alors d'où peut venir le problème, je suis aveugle ou quoi ????


Juste une idée en l'air:
Aurais tu plusieurs ModuleComminicator possibles?
Si oui, précises

ModuleCommunicator communicator =
(org.lr.mydata.utils.ModuleCommunicator)getServlet().getServletContext
().getAttribute("moduleCommunicator");

sinon, peut etre qu'il ne peut fournir plusieurs fois le meme attribut...
(je n'y connais rien en servlet) et donc, quand tu fais le deuxieme
getAttribute (la derniere ligne) cela ne retourne pas la meme chose...

Merci d'avance
Lilian


De rien,
J'espere que je n'ai pas écrit pour rien :)
Tiens moi au courant :)

--
Isammoc

Avatar
LR
Merci pour ta réponse

Juste une idée en l'air:
Aurais tu plusieurs ModuleComminicator possibles?
Si oui, précises

ModuleCommunicator communicator > (org.lr.mydata.utils.ModuleCommunicator)getServlet().getServletContext
().getAttribute("moduleCommunicator");


non, je n'en ai qu'un et j'ai essayé de préciser...

sinon, peut etre qu'il ne peut fournir plusieurs fois le meme attribut...
(je n'y connais rien en servlet) et donc, quand tu fais le deuxieme
getAttribute (la derniere ligne) cela ne retourne pas la meme chose...


ça aurait pu mais je ne crois pas qu'il y ait ce genre de problème. Dans le
doute j'ai essayé de réutiliser "o" et ça n'a rien changé.

A+Lilian

Avatar
Isammoc
Juste une idée en l'air:
Aurais tu plusieurs ModuleComminicator possibles?
Si oui, précises

ModuleCommunicator communicator >> (org.lr.mydata.utils.ModuleCommunicator)getServlet().getServletContext
().getAttribute("moduleCommunicator");


non, je n'en ai qu'un et j'ai essayé de préciser...


erf

sinon, peut etre qu'il ne peut fournir plusieurs fois le meme
attribut... (je n'y connais rien en servlet) et donc, quand tu fais
le deuxieme getAttribute (la derniere ligne) cela ne retourne pas la
meme chose...


ça aurait pu mais je ne crois pas qu'il y ait ce genre de problème.
Dans le doute j'ai essayé de réutiliser "o" et ça n'a rien changé.


erf bis

Tu utilises quel version de java?
Juste pour tester, tu as essayé de le caster en
org.lr.mydata.modules.Communicator ? voir si ca marche?

mais bon, vu qu'il y a o instanceof ModuleCommunicator à false, c'est
normal le ClassCastException...
Ce qui n'est pas normal c'est qu'il est bien une interface de
ModuleCommunicator mais qu'il n'en soit pas une instance...

A+Lilian


Isammoc


Avatar
LR
Tu utilises quel version de java?


5

Juste pour tester, tu as essayé de le caster en
org.lr.mydata.modules.Communicator ? voir si ca marche?


Ca ne donne rien de mieux...

mais bon, vu qu'il y a o instanceof ModuleCommunicator à false, c'est
normal le ClassCastException...
Ce qui n'est pas normal c'est qu'il est bien une interface de
ModuleCommunicator mais qu'il n'en soit pas une instance...


Et comment ça peut être possible ? Je veux dire, comment fonctionne le
"instanceof" ? Il faudrait que je puisse faire de tests supplémentaires pour
trouver d'où vient le problème mais là ça dépasse mes connaissances...

Si quelqu'un a une idée...

Merci d'avance
Lilian

Avatar
Laurent Bossavit
Lilian,

Alors d'où peut venir le problème, je suis aveugle ou quoi ????


C'est un problème de ClassLoader. Les règles de compatibilité entre
classes s'évaluent relativement à un même ClassLoader; je ne connais pas
le fonctionnement de Tomcat mais il y a fort à parier qu'à chaque projet
correspond un ClassLoader distinct.

Laurent

Avatar
LR
Alors d'où peut venir le problème, je suis aveugle ou quoi ????


C'est un problème de ClassLoader. Les règles de compatibilité entre
classes s'évaluent relativement à un même ClassLoader; je ne connais pas
le fonctionnement de Tomcat mais il y a fort à parier qu'à chaque projet
correspond un ClassLoader distinct.


j'ai compris d'où vient le problème. En réalité, j'avais deux copies (une
par projet) du jar contenant l'interface. En fait il fallait n'en mettre
qu'une seule dans le dossier shared/lib de tomcat.

Merci pour votre aide
A+Lilian