Forum Programmation.java Variable qui se vide avec Struts

Posté par  .
Étiquettes : aucune
0
17
nov.
2009
Bonjour,

Je débute un peu avec Struts et je tente de corriger un bug louche et aléatoire.

J'ai une classe A, qui contient une liste de liste de B, la déclaration ressemble à ça :


public class A {


private String id;

private transient List tab;

public List getTab() {

return this.tab;

}

public void setTab(List tab) {

this.tab = tab;

}
}



Dans mon action, j'initialise encore une List de A. Quand je l'affiche à la fin, j'ai bien des données dans tab. Par contre, quand on passe dans le fichier JSP, "tab" est parfois null (par contre les autres variables ne bougent pas). Comme il y a tout une liste de A, on a parfois certains qui sont vides, d'autres non, ou bien tous.

Vu que c'est aléatoire, je pense au garbage collector qui aurait pu nettoyer mes tab, mais je ne vois pas trop où la variable pourrait être déréférencée.

Est-ce que quelqu'un aurait déjà vu un problème de ce genre et saurait comment le résoudre ?

Merci d'avance !
  • # le mot clé transient interdit la sérialisation

    Posté par  (site web personnel) . Évalué à 2.

    As-tu tenté d'enlever le mot clé transient de l'attribut tab ?

    "transient" spécifie que l'attribut en question ne doit pas être sérialisé. S'il y a une sérialisation puis déssérialisation, l'attribut est mis à null.

    cf : http://java.developpez.com/faq/java/?page=langage_motcle#LAN(...)
    • [^] # Re: le mot clé transient interdit la sérialisation

      Posté par  . Évalué à 2.

      J'y ai pensé, j'ai testé, et ça donnait la même chose.
      • [^] # Re: le mot clé transient interdit la sérialisation

        Posté par  . Évalué à 1.

        Le transient me paraissait une bonne piste, dommage ;)


        J'ai déjà eu des problèmes de ce type à l'époque où je faisais du Struts. A mon avis le problème ne se situe pas dans le code que tu as mis...


        Est-ce que tu as essayé de mettre un point d'arrêt dans le setter pour voir s'il est appelé pendant la phase de rendering ? (ou mettre des logs dans le setter, dans le cas où l'argument est null)


        As-tu un champ qui est censé remplir ta valeur tab ? Comme on n'a pas de jsp je ne fais qu'imaginer mais ça se trouve, tu résoudras ton problème en utilisant un getter indexé plutôt qu'un getter sur ta liste ?


        Personnellement j'aurais tendance à éliminer d'office le garbage collector, à moins que tu viennes de découvrir un bug dans la JVM : il n'y a pas de raison qu'une partie de tes objets soit libérée et que ton objet soit mis à jour pour refléter ces changements.
        • [^] # Re: le mot clé transient interdit la sérialisation

          Posté par  . Évalué à 2.

          J'ai essayé de voir si le setter était appelé, mais non.

          J'ai tenté de faire un getter indexé, mais comme je suis encore un peu une burne en Struts, j'ai pas trop su comment faire. Je m'en suis quand même inspiré en ajoutant un HashMap dans ma classe Action, qui contient les "tab" concernés, qui me permet de les récupérer côté JSP, et ça marche.

          Ca ne me donne pas la réponse du pourquoi ma variable devenait aléatoirement null, mais au moins le bug est contourné.

          En tout cas, merci pour ces pistes.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.