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

Struts 1 Java Discussion :

Impossible de sérialiser l'attribut de session


Sujet :

Struts 1 Java

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 61
    Par défaut Impossible de sérialiser l'attribut de session
    Bonjour,

    depuis ces derniers jours, j'ai une exception à chaque fois que j'envoie à un objet à ma session avec la méthode suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    request.getSession().setAttribute(MONOBJET);
    meme si l'objet MONOBJET est serialisé cad implements l'interface Serializable j'ai tjrs l'exception suivante :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
     
    INFO: Impossible de sÚrialiser l'attribut de session listTempOutGroupMembers pou
    r la session 073DE11ABCA775C198DA107C49128CA6
    java.io.NotSerializableException: com.objetdirect.odirectory.services.pojo.dao.L
    azyImageDAO
            at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1054)
     
            at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java
    :1332)
            at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:13
    04)
            at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.jav
    a:1247)
            at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
     
            at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)
            at java.util.ArrayList.writeObject(ArrayList.java:531)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
    java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
    sorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:324)
            at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:80
    9)
            at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:12
    96)
            at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.jav
    a:1247)
            at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
     
            at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)
            at org.apache.catalina.session.StandardSession.writeObject(StandardSessi
    on.java:1415)
            at org.apache.catalina.session.StandardSession.writeObjectData(StandardS
    ecq qlq un peu m aider la dessus, je galere vraiment sur
    ca : :


    merci bcp pour vos reponses!!!!

  2. #2
    Membre chevronné
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Par défaut
    pour qu'un objet soit sérialisable, il faut que chacun de ses attributs le soit également (sauf s'il est transient)
    et là en l'occurence tu as un objet de type
    com.objetdirect.odirectory.services.pojo.dao.LazyImageDAO non sérialisable qui est référencé indirectement par la session donc celle ci n'est pas sérialisable.

    Sinon petite remarque, c'est normal que tu aies un dao en session?

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 61
    Par défaut
    euh oui, c'est un objet DTO, un JAVA bean que utilise un Objet DAO representant une image creer par le DAO de l'application.
    c pas moi qui a fait cette conception, je ne fait que reutiliser les DTO deja implementé pour developper des nouveaux IHM...

    merci pour ta réponse!!

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 61
    Par défaut
    Merci ta réponse ma aidé pour resoudre une exception mais elle me reste celle ci, qu'est ce que tu en pense :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    13 avr. 2006 17:09:58 org.apache.catalina.session.ManagerBase log
    INFO: Impossible de sÚrialiser l'attribut de session fr.improve.struts.taglib.la
    yout.menu.MENU_REPOSITORY pour la session 3F6B68125D1C5D39F2C2EC2B9A138556
    java.io.NotSerializableException: java.lang.ThreadLocal
            at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1054)
     
            at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java
    :1332)
            at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:13
    04)
            at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.jav
    a:1247)
            at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
     
            at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)
            at java.util.ArrayList.writeObject(ArrayList.java:531)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
    java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
    sorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:324)
            at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:80
    9)
            at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:12
    96)
            at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.jav
    a:1247)
            at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
     
            at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java
    :1332)
            at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:13
    04)
            at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.jav
    a:1247)
            at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
     
            at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)
            at java.util.ArrayList.writeObject(ArrayList.java:531)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
    java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
    sorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:324)
    : :

  5. #5
    Membre chevronné
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Par défaut
    ben cette fois attention : un threadLocal est une classe du jdk qui ne peut pas être sérialisée. Le thread local permet de stocker des donnée propres au thread en cours d'exécution (ici : le thread qui exécute la requête utilisateur sur le serveur). Ca n'a pas de sens de sérialiser un tel attribut dans une session car une même session utilisateur peut être utilisée par plusieurs thread au cours du temps. Le mieux est de placer l'attribut en transient pour ne pas le sérialiser, ou de le copier dans un autre attribut de l'objet pour au contraire le sérialiser.

  6. #6
    Membre chevronné
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Par défaut
    bon en y repensant, si la désérialisation d'un threadlocal réassocie juste la valeur au thread en cours et ne garde pas d'état "interne" du thread précédent, alors tu peux créer une classe dérivant de threadLocal et implémentant Serializable et utiliser cette classe à la place pour ton attribut en session.

    C'est du hack de la mort car il doit y a avoir une raison pour que ca ne soit pas sérializable (du style ca marche pas dans certains cas). En même temps ThreadLocal n'est pas déclarée "final", donc on peut en dériver...

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 61
    Par défaut
    merci bcp pour tes reponses.. ca à l'air de ne pas etre facile, l'objet que je renvoie ma session est un objet de struts-layout.


    un objet de type MenuComponent, pour heriter de la classe ThreadLocal et implementer Serializable, je dois modifier le code strts-layout...

    il n y a pas d'heritage multiple en JAVA, je ne peu pas creer une classe et heriter de ThreadLocal et de MenuComponent à la fois puis implementer l 'interfac serializable..

    je ne vois pas comment je peu faire..

    :

  8. #8
    Membre chevronné
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Par défaut
    tu dois avoir un léger pbl de conception
    Les menus et autres composants d'ihm ne doivent pas être stocké en session. D'ailleurs tu remarques que ce n'est pas prévu . Pour ne pas avoir de surprises, limite la session à tout ce qui se rapporte à l'utilisateur et sa conversion avec le serveur ! dans l'architecture MVC de struts, le modèle (M) est géré par les ActionForm qui sont stockés en session et cela doit suffire en théorie. Donc, si possible, laisses Struts gérer l'affichage en fonction de l'ActionForm associé à ton formulaire. Facile à dire peut être, car ton appli génère des contraintes particulières?

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 61
    Par défaut
    ok merci , je vais essayer de tester ca madi au boulot..

    j'utilise une ActionDynaForm, donc mon action Form est gerer dynamiqument par Struts..

    je vais modifier et utiliser un formbean je vais l'associer à actionForm et j'espere que ca marchera!!!!



Discussions similaires

  1. Réponses: 2
    Dernier message: 05/02/2015, 18h34
  2. Impossible de sérialiser l'attribut de session
    Par momjunior dans le forum Développement Web en Java
    Réponses: 7
    Dernier message: 18/11/2014, 14h04
  3. Impossible de récupérer un attribut de la session
    Par Rhimo dans le forum Développement Web en Java
    Réponses: 11
    Dernier message: 27/07/2011, 13h37
  4. [Tomcat] afficher la liste des attributs en session
    Par michaelbob dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 11/04/2006, 01h07
  5. Impossible de changer les attributs d'un dossier
    Par NeHuS dans le forum Autres Logiciels
    Réponses: 20
    Dernier message: 03/03/2006, 09h38

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