5 Replies Latest reply on Feb 1, 2007 11:12 AM by Gavin King

    NotSerializableException:ThreadLocal   when using PAGE scope

    Radu Aghinii Newbie

      Hello all.

      I'm porting the display side of an existing EJB3 backed webapp to
      Seam w/ JSF/Facelets and EJB3 on Jboss AS.
      ( jboss 4.0.5GA w/ Seam 1.1.1GA )

      A few pages are working front to back so the plumbing is at least generally functional.

      The current issue is that i have a Seam managed bean (pojo) into which is injected another pojo that has a SESSION scope.

      Things work fine if my first object is event scoped or session scoped, but if i change the scope to "PAGE" then i get this serialization Exception.

      is this supposed to work ?

      javax.faces.FacesException: java.io.NotSerializableException: java.lang.ThreadLocal
       at org.apache.myfaces.shared_impl.util.StateUtils.getAsByteArray(StateUtils.java:190)
       at org.apache.myfaces.shared_impl.util.StateUtils.construct(StateUtils.java:150)
       at org.apache.myfaces.renderkit.html.HtmlResponseStateManager.writeState(HtmlResponseStateManager.java:102)
       at org.apache.myfaces.application.jsp.JspStateManagerImpl.writeState(JspStateManagerImpl.java:430)
       at org.jboss.seam.jsf.SeamStateManager.writeState(SeamStateManager.java:66)
       at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:599)
       at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:384)
       at javax.faces.webapp.FacesServlet.service(FacesServlet.java:138)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
       at org.jboss.seam.servlet.SeamRedirectFilter.doFilter(SeamRedirectFilter.java:32)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
       at com.pimp.servlet.BrandRedirectFilter.doFilter(BrandRedirectFilter.java:80)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
       at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
       at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
       at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
       at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
       at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
       at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
       at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
       at org.jboss.web.tomcat.tc5.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156)
       at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
       at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
       at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
       at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
       at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
       at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
       at java.lang.Thread.run(Thread.java:595)
      Caused by: java.io.NotSerializableException: java.lang.ThreadLocal
       at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1081)
       at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1375)
       at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1347)
       at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1290)
       at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1079)
       at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302)
       at java.util.ArrayList.writeObject(ArrayList.java:569)
       at sun.reflect.GeneratedMethodAccessor198.invoke(Unknown Source)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:585)
       at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:917)
       at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1339)
       at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1290)
       at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1079)
       at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1375)
       at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1347)
       at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1290)
       at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1079)
       at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302)
       at java.util.HashMap.writeObject(HashMap.java:1039)
       at sun.reflect.GeneratedMethodAccessor202.invoke(Unknown Source)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:585)
       at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:917)
       at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1339)
       at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1290)
       at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1079)
       at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1251)
       at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1075)
       at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1251)
       at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1075)
       at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1251)
       at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1075)
       at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302)
       at org.apache.myfaces.shared_impl.util.StateUtils.getAsByteArray(StateUtils.java:180)
       ... 32 more
      



      also, is this mention of JspStateManager in the stacktrace a concern given that JSPs aren't supposed to be involved here at all ?

      org.apache.myfaces.application.jsp.JspStateManagerImpl.writeState(JspStateManagerImpl.java:430)
      



      Here are the classes in my stripped down test case.
      the bean that's injected:
      @Name("loginSessionFoo")
      @Scope(ScopeType.SESSION)
      public class TestSessionScoped implements Serializable {
      
       @Logger
       private Log log;
      
       private String foo;
       public String getFoo() {
       return foo;
       }
       public void setFoo(String foo) {
       this.foo = foo;
       }
      
      }
      


      the one into which it is injected
      @Scope(ScopeType.PAGE)
      @Name("contentDisplay")
      public class ContentDisplay implements Serializable {
      
       @Logger
       private Log log;
      
       private Date oneDayAgo;
      
       @In(value="loginSessionFoo", create=true)
       private TestSessionScoped foo;
      
       /**
       * Currently acts only to give out a date 1 day ago today to see
       * that's used for display calculations.
       *
       */
       //CHECK does this still seem like a good idea
       @Create
       public void initialize() {
      
       Calendar cal = new GregorianCalendar();
       cal.add(GregorianCalendar.DAY_OF_YEAR, -1);
       this.oneDayAgo =cal.getTime();
       }
      
       // some action methods removed....
      }
      


      any pointers appreciated. thanks.

      radu