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 ????
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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
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 ????
Juste une idée en l'air:
Aurais tu plusieurs ModuleComminicator possibles?
Si oui, précises
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 :)
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
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
LR
Merci pour ta réponse
Juste une idée en l'air: Aurais tu plusieurs ModuleComminicator possibles? Si oui, précises
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
Merci pour ta réponse
Juste une idée en l'air:
Aurais tu plusieurs ModuleComminicator possibles?
Si oui, précises
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é.
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
Isammoc
Juste une idée en l'air: Aurais tu plusieurs ModuleComminicator possibles? Si oui, précises
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
Juste une idée en l'air:
Aurais tu plusieurs ModuleComminicator possibles?
Si oui, précises
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...
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
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
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...
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
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
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.
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
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
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.
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.