2010-06-14 5 views
9

Je me suis cogné la tête avec un bean géré @ViewScoped. J'utilise le composant "schedule" de premier plan pour afficher certains événements. Lorsque l'utilisateur clique sur un bouton spécifique une méthode dans le bean viewscoped est appelée en utilisant ajax mais chaque fois que j'obtiens un "java.io.NotSerializableException", si je change la portée du bean géré pour demander le problème disparaît.@EJB dans le bean géré @ViewScoped provoque java.io.NotSerializableException

Qu'est-ce que je fais mal? des idées?

ici est mon bean géré:

@ManagedBean(name = "schedule") 
@ViewScoped 
public class ScheduleMBean implements Serializable { 

    @EJB 
    private CongeBean congeBean; 


    @ManagedProperty(value = "#{sessionBean}") 
    private SessionMBean sessionBean; 

    private DefaultScheduleModel visualiseurConges = null; 

    public ScheduleMBean(){ 

    } 
    @PostConstruct 
    public void init() { 

     if(visualiseurConges == null){ 

       visualiseurConges = new DefaultScheduleModel(); 
     } 



    } 

    public void updateSchedule(){ 

     visualiseurConges.addEvent(new DefaultScheduleEvent("test" , new Date(), new Date())); 



    } 

    public void setVisualiseurConges(DefaultScheduleModel visualiseurConges) { 
     this.visualiseurConges = visualiseurConges; 
    } 

    public DefaultScheduleModel getVisualiseurConges() { 



     return visualiseurConges; 
    } 

    public void setSessionBean(SessionMBean sessionBean) { 
     this.sessionBean = sessionBean; 
    } 

    public SessionMBean getSessionBean() { 
     return sessionBean; 
    } 



} 

ici est la trace pile complète

GRAVE: java.io.NotSerializableException: fr.novae.conseil.gestion.ejb.security.__EJB31_Generated__AuthenticationBean__Intf____Bean__ 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) 
    at java.util.HashMap.writeObject(HashMap.java:1001) 
    at sun.reflect.GeneratedMethodAccessor592.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) 
    at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) 
    at java.util.HashMap.writeObject(HashMap.java:1001) 
    at sun.reflect.GeneratedMethodAccessor592.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) 
    at com.sun.faces.renderkit.ClientSideStateHelper.doWriteState(ClientSideStateHelper.java:293) 
    at com.sun.faces.renderkit.ClientSideStateHelper.writeState(ClientSideStateHelper.java:167) 
    at com.sun.faces.renderkit.ResponseStateManagerImpl.writeState(ResponseStateManagerImpl.java:123) 
    at com.sun.faces.application.StateManagerImpl.writeState(StateManagerImpl.java:155) 
    at org.primefaces.application.PrimeFacesPhaseListener.writeState(PrimeFacesPhaseListener.java:174) 
    at org.primefaces.application.PrimeFacesPhaseListener.handleAjaxRequest(PrimeFacesPhaseListener.java:111) 
    at org.primefaces.application.PrimeFacesPhaseListener.beforePhase(PrimeFacesPhaseListener.java:74) 
    at com.sun.faces.lifecycle.Phase.handleBeforePhase(Phase.java:228) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:99) 
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) 
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:69) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) 
    at java.lang.Thread.run(Thread.java:619) 

merci à l'avance

Répondre

16

@ViewScoped haricots sont stockés en session HTTP. Tous les objets stockés dans la session HTTP doivent implémenter Serializable. Voir aussi JSF managed bean causing java.io.NotSerializableException during Tomcat deployment et java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException.

Le NotSerializableException s'explique généralement d'elle-même puisqu'il mentionne le nom qualifié complet de la classe qui doit également être sérialisé, mais ne peut pas l'être puisqu'il n'implémente pas Serializable.

Cependant, dans ce cas particulier, le nom semble indiquer une classe autogénérée, probablement générée automatiquement par le conteneur EJB et donc totalement hors de votre contrôle.

Je n'ai jamais vu ce problème avant et Google ne semble pas donner beaucoup sur ce problème. Basé sur le stacktrace que vous utilisez Glassfish v3, donc je suggère de poster un issue à ce sujet. En attendant votre meilleur pari est probablement de mettre l'économie de l'état d'affichage JSF sur le côté serveur.


Mise à jour: un problème similaire MyFaces suggère un problème spécifique de impl JSF d'utiliser mal classloader lors de la désérialisation. Mise à niveau de l'impl JSF devrait résoudre le problème: @EJB in @ViewScoped @ManagedBean causes java.io.NotSerializableException.

+0

Salut, merci pour votre réponse, en fait la "sauvegarde état-vue" a été mis à "CLIENT" Je ne me rendais pas compte que le fichier web.xml a été généré automatiquement par l'IDE. Cependant je pensais que "l'économie d'état du client" était la voie à suivre, mais d'après ce que je peux voir si je veux utiliser les fèves gérées @ViewScoped, je dois le changer pour "sauvegarder l'état du serveur" ou faire tous mes EJB et ManagedBeans mettre en œuvre sérialisable qui je pense est un peu compliqué .... – ufasoli

+1

Là, vous avez l'IDE pour. Pour générer automatiquement du code. Vous n'avez qu'à comprendre ce que l'IDE fait et comment l'utiliser correctement :) Personnellement, je voudrais simplement me débarrasser de l'économie d'état côté client. La mémoire du serveur est moins chère que la bande passante du réseau et l'expérience utilisateur sera plus améliorée lorsque le transfert de données HTTP sera plus rapide. – BalusC

+1

ouais! merci TRÈS TRÈS, vous et vos articles m'avez sauvé beaucoup de temps une fois de plus! – ufasoli

Questions connexes