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

Spring Java Discussion :

Spring déserialization d'un bean


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1
    Par défaut Spring déserialization d'un bean
    Bonjour,

    J'ai suivi le tutoriel d'Alexis Hassler (LIEN ICI) montrant la création d'une petite application web intégrant JSF+Spring+Hibernate. A la fin de son exemple, il crée un bean JSF courseBean possédant un objet CourseService qui lui est injecté par Spring lors de sa création (c.f. plus bas). Seulement cet objet est déclaré comme transient. Celà pose donc problème si on arrête le serveur (TomCat), car lors du redémarrage de ce dernier, les session beans vont être désérialisés et courseService va être assigné à null. Toutes les personnes ayant une session active durant le redémarrage du serveur vont donc avoir un joli NullPointerException lorsqu'elles utilisent cet objet (ici la méthode update()). De l'autre côté si on ne déclare pas le champs comme transient, on aura une erreur de TomCat qui n'arrive pas à restaurer l'objet.. (c.f plus bas) Comment peut-on faire pour que Spring "reWire" notre objet courseService lors de sa déserialization? Je pensait redéfinir la méthode readObject(ObjectInputStream in) de CourseBean et recréer moi même l'objet CourseService via Spring, mais mes notions de Spring et JSF sont très très fraiches et je ne sais pas si une telle chose est possible :-) Qqn pourrait-il m'aider?

    Bean JSF:
    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
    48
    @Component("courseBean")
    @Scope("session")
    public class CourseBean implements Serializable {
    	private static final long serialVersionUID = 34L;
     
    	@Autowired
    	private transient CourseService courseService; /* ICI = objet déclaré transient */
    	private transient HtmlScrollableDataTable courseTable;
     
    	private List<Course> courseList;
    	private Course currentCourse;
     
    	@PostConstruct
    	public void init(){
    		courseList = courseService.findAll();
    	}
     
    	/* Navigation Methods */
    	public String viewNew() {
    		currentCourse = new Course();
    		return "detail";
    	}
     
    	public String viewDetail() {
    		List<Course> valueList = (List<Course>)courseTable.getValue();
    		Iterator keys = courseTable.getSelection().getKeys();
     
    		/* At least one elem has been selected */
    		if(keys.hasNext()){
    			courseTable.setRowKey(keys.next());
    			currentCourse = (Course)courseTable.getRowData();
     
    			return "detail";
    		}
     
    		return null;
    	}
     
    	public String update(){
    		courseService.save(currentCourse);
    		init();
    		return null;
    	}
     
    	/* Getter/Setter */
     
    	/* ... (Supprimé) */
    }
    Exception générée lorsqu'on enlève le mot clef transient:
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    GRAVE: Exception au chargement des sessions depuis le stockage persistant (persistent storage)
    java.lang.IllegalStateException: Cannot deserialize BeanFactory with id org.springframework.web.context.WebApplicationContext:/university: no factory registered for this id
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory$SerializedBeanFactoryReference.readResolve(DefaultListableBeanFactory.java:972)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:597)
    	at java.io.ObjectStreamClass.invokeReadResolve(ObjectStreamClass.java:1061)
    	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1761)
    	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
    	at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
    	at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:479)
    	at org.springframework.aop.support.AbstractBeanFactoryPointcutAdvisor.readObject(AbstractBeanFactoryPointcutAdvisor.java:98)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:597)
    	at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
    	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848)
    	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
    	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
    	at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1666)
    	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1322)
    	at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
    	at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:479)
    	at org.springframework.aop.framework.AdvisedSupport.readObject(AdvisedSupport.java:550)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:597)
    	at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
    	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848)
    	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
    	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
    	at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
    	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
    	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
    	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
    	at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
    	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
    	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
    	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
    	at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
    	at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:479)
    	at ch.elca.university.web.CourseBean.readObject(CourseBean.java:34)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:597)
    	at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
    	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848)
    	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
    	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
    	at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
    	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
    	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
    	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
    	at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
    	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
    	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
    	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
    	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
    	at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1475)
    	at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:977)
    	at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:394)
    	at org.apache.catalina.session.StandardManager.load(StandardManager.java:321)
    	at org.apache.catalina.session.StandardManager.start(StandardManager.java:643)
    	at org.apache.catalina.core.ContainerBase.setManager(ContainerBase.java:438)
    	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4559)
    	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    	at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
    	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
    	at org.apache.catalina.core.StandardService.start(StandardService.java:519)
    	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    	at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:597)
    	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)

  2. #2
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 42
    Par défaut
    Bonjour,

    Moi aussi j'ai le même problème est ce que quelqu'un a une solution??

  3. #3
    Membre averti
    Inscrit en
    Février 2011
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 28
    Par défaut
    moi aussi j'ai le même problème. par contre l'application fonction a merveille !

  4. #4
    Membre émérite Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Par défaut
    A priori le scope courseService n'est pas session cela doit être un prototype ou un singleton. Du coup c'est normale de ne pas le serializer avec la session donc de garder transcient.
    Par contre quand on desserialize je pense qu'il faut le récupérer du contexte spring dans le code en surchargeant readObject.

Discussions similaires

  1. [Framework] Injection de Service spring dans un managed bean JSF
    Par _skip dans le forum Spring
    Réponses: 10
    Dernier message: 12/03/2009, 09h28
  2. Réponses: 3
    Dernier message: 14/01/2009, 17h53
  3. [Spring + Struts]Injecter un bean dans un plugin Struts
    Par Saverok dans le forum Spring Web
    Réponses: 1
    Dernier message: 18/12/2008, 15h18
  4. [Spring][Modules] Validator de beans
    Par KiLVaiDeN dans le forum Spring
    Réponses: 4
    Dernier message: 31/07/2007, 13h46
  5. Réponses: 12
    Dernier message: 24/05/2006, 15h37

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