2010-06-14 67 views
9

我一直在用@ViewScoped托管bean敲打我的头。我正在使用primeface的“时间表”组件来显示一些事件。当用户点击一个特定的按钮时,使用ajax调用了viewcoped bean中的一个方法,但每当我得到一个 “java.io.NotSerializableException”时,如果我更改了托管bean范围以请求消除问题。@ViewScoped托管bean中的@EJB导致java.io.NotSerializableException

我在做什么错?有任何想法吗?

这里是我的托管bean:

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



} 

这里堆满跟踪

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) 

在此先感谢

回答

16

@ViewScoped豆存储在HTTP会话。存储在HTTP会话中的任何对象都需要实现Serializable。另请参阅JSF managed bean causing java.io.NotSerializableException during Tomcat deploymentjava.io.WriteAbortedException: writing aborted; java.io.NotSerializableException

NotSerializableException通常是自解释的,因为它提到了需要序列化的类的全限定名,但不能是因为它没有实现Serializable

但是,在这种特殊情况下,该名称似乎表示自动生成的类,很可能由EJB容器自动生成,因此完全不受您的控制。

我从来没有见过这个问题,谷歌似乎也没有多少提到这个问题。基于您使用Glassfish v3的堆栈跟踪,所以我建议发布一个关于这个的issue。与此同时,最好的办法是将JSF视图状态保存设置为服务器端。


更新:MyFaces中类似的问题,建议在反序列化过程中使用错误的类加载器的JSF实现了一套具体的问题。升级JSF impl应该可以解决问题:@EJB in @ViewScoped @ManagedBean causes java.io.NotSerializableException

+0

嗨, 感谢您的回答,实际上“视图状态保存”设置为“客户端”我没有意识到,因为web.xml文件是由IDE自动生成的。 然而,我认为“客户端状态保存”是要走的路,但从我可以看到的是,如果我想使用@ViewScoped托管bean,我需要将其更改为“服务器状态保存”或使所有的EJB和ManagedBeans实现可串行化,我认为有点复杂.... – ufasoli 2010-06-14 15:00:57

+1

那里你有IDE。自动生成代码。你只需要了解IDE的功能和如何正确使用它:)我个人只是摆脱了客户端状态保存。服务器内存比网络带宽便宜,并且当HTTP数据传输速度更快时,用户体验将得到更大改善。 – BalusC 2010-06-14 15:16:08

+1

是啊!非常感谢你,你和你的文章再次为我节省了很多时间! – ufasoli 2010-06-14 15:31:58