2010-06-14 13 views
9

He estado dando golpes con un @ViewScoped managed-bean. Estoy usando el componente "schedule" de primeface para mostrar algunos eventos. Cuando el usuario hace clic en un botón específico, se llama a un método en el bean viewscoped usando ajax, pero cada vez que obtengo una "java.io.NotSerializableException", si cambio el ámbito del frijol administrado para solicitar que el problema desaparezca.@EJB en @ViewScoped bean administrado causa java.io.NotSerializableException

¿Qué estoy haciendo mal? ¿algunas ideas?

aquí es mi bean administrado:

@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; 
    } 



} 

aquí es la traza-pila completa

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) 

gracias de antemano

Respuesta

16

@ViewScoped granos se almacenan en la sesión HTTP. Cualquier objeto que esté almacenado en la sesión HTTP debe implementar Serializable. Consulte también JSF managed bean causing java.io.NotSerializableException during Tomcat deployment y java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException.

El NotSerializableException suele ser autoexplicativo, ya que menciona el nombre completo de la clase que también debe ser serializada, pero no puede serlo porque no implementa Serializable.

Sin embargo, en este caso particular, el nombre parece indicar una clase autogenerada, muy probablemente autogenerada por el contenedor EJB y por lo tanto completamente fuera de su control.

Nunca he visto este problema antes y Google tampoco parece dar mucho de este problema. Basándome en stacktrace, estás usando Glassfish v3, por lo que te sugiero publicar un issue al respecto. Mientras tanto, la mejor opción es, probablemente, establecer el ahorro de estado de la vista JSF en el lado del servidor.


actualización: un problema similar en MyFaces sugiere un tema específico impl JSF de la utilización de cargador de clases mal durante la deserialización. Actualizar el impl de JSF debería resolver el problema: @EJB in @ViewScoped @ManagedBean causes java.io.NotSerializableException.

+0

Hola, gracias por su respuesta, en realidad el "ahorro de estado de vista" se estableció en "CLIENTE". No me di cuenta de que el IDE había generado automáticamente el archivo web.xml. Sin embargo, pensé que el "ahorro de estado del cliente" era el camino a seguir, pero por lo que puedo ver si quiero usar @ViewScoped managed-beans, necesito cambiarlo a "server state saving" o hacer todos mis EJB y ManagedBeans implementar serializable que creo que es un poco complicado .... – ufasoli

+1

Ahí tienes el IDE para. Para autogenerar el código. Solo tienes que entender qué hace el IDE y cómo usarlo correctamente :) Personalmente me deshace del ahorro del estado del lado del cliente. La memoria del servidor es más económica que el ancho de banda de la red y la experiencia del usuario mejorará cuando la transferencia de datos HTTP sea más rápida. – BalusC

+1

sí! ¡muchas gracias, usted y sus artículos me han ahorrado una gran cantidad de tiempo una vez más! – ufasoli

Cuestiones relacionadas