IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Taglibs Java Discussion :

Problème avec une surcharge de méthode [Custom Tags]


Sujet :

Taglibs Java

  1. #1
    Membre averti
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Points : 330
    Points
    330
    Par défaut Problème avec une surcharge de méthode
    Je possède un taglib héritant d'un autre, et la fille surcharge une méthode de la mère :
    Dans la mère : setValue(Object)
    Dans la fille : setValue(String)

    Lorque le tag est utilisé dans une page JSP, je réçois une erreur de la part du serveur :
    Error parsing JSP page /pages/main/client/cli_lst.jsp

    Syntax error in source
    /pages/main/client/cli_lst.jsp.java:256: reference to setValue is ambiguous, both method setValue(java.lang.String) in com.sfwan.sfnet.jsp.html.myformtags.LabelLib and method setValue(java.lang.Object) in com.sfwan.sfnet.jsp.html.myformtags.DateLabelLib match

    __tag4.setValue(com.orionserver.util.ObjectUtils.toString(

    ^

    1 error
    Ce que je ne comprends pas, c'est que mes collègues n'obtiennent pas cet erreur, alors qu'ils ont les mêmes sources.
    Quelqu'un a-t-il déjà eu ce problème ou une explication ? Une solution (là je crois que je rêve ) ?

    J'utilise Orion 2.0.5

    Merci de votre aide,
    Strab


    [Modéré par Didier] : ajout de tag dans le titre - Les règles du forum Java

  2. #2
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    DateLabelLib hérite de LabelLib c'est ça ?

    Peux-tu montrer le bout de code JSP qui produit l'erreur ?

    Personnellement, je pense que ton Lib devrait toujours prendre une String en paramètre, car la JSP ne type pas les variables.
    K

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut Re: problème avec une surcharge de méthode
    Salut,

    Citation Envoyé par strabest
    Je possède un taglib héritant d'un autre, et la fille surcharge une méthode de la mère :
    Dans la mère : setValue(Object)
    Dans la fille : setValue(String)
    Le problème vient qu'il y a deux méthode setValue() pour la classe Fille (puisque que c'est une surcharge et non pas une redéfinition).
    En effet, lorsque tu utilises une taglib, le serveur d'application utilise par exemple la méthode setValue() pour renseigner l'attribut value de ta taglib. Or dans ce cas ton serveur d'application ne sait pas laquelle il doit utiliser (reference to setValue is ambiguous).

    Citation Envoyé par strabest
    Ce que je ne comprends pas, c'est que mes collègues n'obtiennent pas cet erreur, alors qu'ils ont les mêmes sources.
    Quelqu'un a-t-il déjà eu ce problème ou une explication ?
    Il doivent surement utiliser un serveur d'application différent (ou une version différente). Il faudrait voir les specifications J2EE pour savoir quel serveur est aux normes...

    Citation Envoyé par strabest
    Une solution (là je crois que je rêve ) ?
    La seule solution serait de ne pas surcharger setValue() mais de la redéfinir, par exemple dans la classe Fille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void setValue (Object object) {
    	setValueAsString ( object==null ? null : object.toString );
    }
     
    public void setValueAsString (Strign string) {
    	// le code de ton setValue(String)
    }
    Tu évites ainsi l'ambiguité...

    a+

  4. #4
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    adiGuba : pour une taglib, définir une méthode qui prend en paramètre autre chose que String c'est utile ?

    J'ai l'impression que lorsque tu donnes un paramètre en JSP, il est toujours du type String, non ? Ou je fais une confusion ?
    K

  5. #5
    Membre averti
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Points : 330
    Points
    330
    Par défaut
    Oui c'est ça.

    On peut utiliser des types objets dans une JSP lorsqu'on utilise les instructions genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <malib:montag attr="<%= unObjet.getQqch() %>" />
    Lors du déploiement en servlet, on aura dans le code java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    montag_instance.setAttr(unObjet.getQqch());
    C'est ce qui se passe dans ma page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <form:datelabel value="<%=ligne.get(\"cli_datretmlg\")%>" emptymsg="&nbsp;" />

  6. #6
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    D'accord, merci pour la précision.

    Donc si tu castes la valeur de unObjet.getQqch() en (String), peut-être que la bonne méthode est utilisée ?
    K

  7. #7
    Membre averti
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Points : 330
    Points
    330
    Par défaut
    Non car étant donné que String hérite de Object, le compilateur ne sait pas si il doit l'interpréter en tant que Object ou String, les deux étant possible à cause de la surcharge. Edit 'ailleursle serveur la fait la conversion, cf la différence entre le message d'erreur et le code JSP.

    Je vais enquêter sur les différences avec mes collègues, mais ça me semble bizzarre quand même car nos version de Orion sont au pire très proche. Genre il a la 2.0.4 et moi la 2.0.5...

    Merci pour votre aide

  8. #8
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par KiLVaiDeN
    adiGuba : pour une taglib, définir une méthode qui prend en paramètre autre chose que String c'est utile ?
    Oui, strabest a répondu à ta question, et j'ajouterais que l'on peut également utiliser les EL (avec les JSP 2.0, ou avec un taglib compatible pour les précédentes version de JSP):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <malib:montag attr="${unObject.qqch}" />
    qui est l'équivalent de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <malib:montag attr="<%= ( (MonType) pageContext.getAttribute("unObjet") ).getQqch() %>" />
    Citation Envoyé par KiLVaiDeN
    Donc si tu castes la valeur de unObjet.getQqch() en (String), peut-être que la bonne méthode est utilisée ?
    Ca pourrait marcher... Sinon si c'est une taglib 1.2, tu peux aussi essayer de forcer le type de l'attribut dans ton TLD :
    http://adiguba.developpez.com/tutoriels/j2ee/jsp/taglib/#L2.1.6

    a++

  9. #9
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Génial, merci beaucoup pour ces informations claires et précises adiGuba et strabest
    K

  10. #10
    Membre averti
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Points : 330
    Points
    330
    Par défaut
    Après vérification, mes deux collègues qui travaillent sur le projet ont la même version de Orion que moi 2.0.5, et eux n'ont pas ce problème.

    Nous utilisons des taglibs 1.0, donc pour forcer le type...
    A moins que. Je suppose que 1.0 est compatible avec 1.2. Donc si je change la version dans l'en-tête du xml et que je force le type de l'attribut, ca devrait être correct ? (sans chercher à savoir si ça va marcher)

    Je vais essayer. Merci pour l'info

  11. #11
    Membre averti
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Points : 330
    Points
    330
    Par défaut
    Alors en fait le truc de passer les tagLib en 1.2 ça ne marche pas.

    Mais en allant voir plus en détails ce qu'il se passe dans les taglib (qui ont été fait bien avant que j'arrive, et je ne travaille pas dessus), je me suis rendu compte qu'en fait la classe fille avait un setValue(Object), et la mère a un setValue(Object) qui fat exactement la même chose que sa fille, et un setValue(String). Le setValue(Object p_value) fait juste un value = p_value.toString()... On a donc trois fonctions qui font exactement la même chose !

    J'ai voulu faire du ménage, mais étant donné que value est de type String, le compilateur exige une méthode setValue(String). Je ne connais pas trop le projet, mais à mon avis si il y a une méthode setValue(Object), c'est qu'elle sert ou peut servir, donc je ne peux pas l'enlever.
    Du coup je ne sais plus quoi faire...

    Et je ne comprens toujours pas pourquoi ça marche chez mes collègues et pas chez moi !

  12. #12
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Si j'étais toi, j'enleverais la méthode setValue(String unstring) pour ne garder que la méthode setValue(Object unobject) et je testerais dans la classe fille si l'object est instanceof String, pour faire ton traitement spécifique ( apparement une transformation de String vers Date ? )
    K

  13. #13
    Membre averti
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Points : 330
    Points
    330
    Par défaut
    Citation Envoyé par strabest
    mais étant donné que value est de type String, le compilateur exige une méthode setValue(String).
    Si j'enlève la méthode setValue(String), le serveur me répond :
    Property 'value' of bean/tag 'com.sfwan.sfnet.jsp.html.myformtags.LabelLib' is read only
    Je ne vois pour l'instant qu'une chose à faire, c'est voir si je peux enlever celle qui prend un Object. Mais j'en doute (je ne connais pas trop le projet car je suis chargé uniquement des tests, mais là il faut que je fasse quelque chose car je ne peux naviguer dans certaines parties du projet, et mes collègues ont l'air de s'en foutre...)

    Strab

  14. #14
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Je pense que si adiGuba était dans ton équipe, tous tes problèmes auraient déjà étés résolus

    Je ne comprend pas le message comme quoi ton champs value est de type read-only uniquement...
    K

  15. #15
    Membre averti
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Points : 330
    Points
    330
    Par défaut
    Citation Envoyé par KiLVaiDeN
    Je ne comprend pas le message comme quoi ton champs value est de type read-only uniquement...
    La proriété value est de type String, donc le serveur recherche une méthode setValue(String). Comme il ne trouve que getValue() si j'enlève setValue(String), il en déduit que value est read-only...

  16. #16
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Ah !

    Merci pour l'explication... donc mon interrogation reste entière par rapport à la nécessité d'avoir un champs value en String, pourquoi ne pas avoir le champs en Object, ainsi tu pourrais mettre ce que tu veux comme paramètre de ta méthode setValue(Object tonobject).

    Mais peut-être que je dis trop de bêtises je vais arrêter les dégats
    K

  17. #17
    Membre averti
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Points : 330
    Points
    330
    Par défaut
    Je ne sais pas pourquoi le serveur impose String et pas juste une mère de String

    Par contre là je suis trop heureux parce que j'ai réussi à faire marcher le truc (mais je ne comprends pas pourquoi ).
    Rappelez-vous, il y avait trois méthodes setValue : string et objet dans la mère, et object dans la fille. En dernier recours, j'ai supprimé celle de la fille, et ça marche !
    Il y a toujous une setValue(String) et une setValue(Object) mais apparemment maintenant Orion a décidé que ce n'est plus ambigu...

    Arf, ça marche, c'est déjà pas mal

    Merci votre aide et vos infos KiLVaiDeN et adiGuba

    Strab

  18. #18
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    J'ai pas compris grand chose et je n'ai pas été d'une grande aide sur ce coup là mais je serais moins bête ce soir

    Content pour toi que ça marche
    K

  19. #19
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par strabest
    Je ne sais pas pourquoi le serveur impose String et pas juste une mère de String
    Si l'attribut n'est pas dynamique (rtexprvalue = true) je pense que cela doit obligatoirement correspondre à un String. Object est bien trop vague puisqu'il accepte n'importe quel type... Je pense que cela doit être la cause...

    a++

    PS : Un petit clic sur le bouton (en bas à gauche)... Merci

  20. #20
    Membre averti
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Points : 330
    Points
    330
    Par défaut
    Merci pour l'info, je venais justement faire ce petit clic

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] probléme avec les surcharges de méthodes
    Par lila23 dans le forum C#
    Réponses: 5
    Dernier message: 30/06/2011, 15h44
  2. [PHP 5.3] [POO]Problème avec une méthode statique
    Par yann18 dans le forum Langage
    Réponses: 6
    Dernier message: 25/05/2011, 19h32
  3. Problème avec une méthode en Java
    Par hala02 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 21/12/2010, 22h56
  4. Réponses: 5
    Dernier message: 29/05/2008, 10h05
  5. Problème avec une méthode virtuelle pure
    Par Burckel dans le forum C++
    Réponses: 4
    Dernier message: 05/12/2006, 13h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo