7 Replies Latest reply: Nov 15, 2012 10:16 AM by pintail RSS

(NotSerializableException) ViewScoped bean with reference to stateless session bean

pintail Newbie

Hi,

 

I have a JSF 2.0 filterable overview page using a @SessionScoped controller to provide data for my page. My controller is injected with a repository (stateless session bean) to load data from the database.

 

@Named

@SessionScoped

public class MyController implements Serializable {

   @Inject private EntityRepository entityRepository;

 

  ...

}

 

@Stateless

@LocalBean

public class EntityRepository implements Serializable {

    ...

}

 

This works, but now my filter and data are kept throughout the whole session, while it should only be kept during this view.

That is why I introduced Seam Faces to my stack and I changed @SessionScoped to @ViewScoped.

 

Aparently this has a different impact on how my class instances are Serialized / Passivated (not sure which is the right word in this context). Because I now am getting a java.io.NotSerializableException.

000001dd JspStateManag E   Exiting serializeView - Could not serialize state: cannot serialize WSEjbBean [businessLocals=[class com.work.EntityRepository], ejbName=EntityRepository241200632,Name:null,WebBeans Type:ENTERPRISE,API Types:[java.lang.Object,com.work.EntityRepository],Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default]

                                 java.io.NotSerializableException: cannot serialize WSEjbBean [businessLocals=[class com.work.EntityRepository], ejbName=EntityRepository241200632,Name:null,WebBeans Type:ENTERPRISE,API Types:[java.lang.Object,com.work.EntityRepository],Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default]

 

I found in the CDI Specification JSR 299, section 6.6.1 Passivation Capable Beans: 'As defined by the EJB specification, all statefull session beans are passivation capable. Stateless and singleton session beans are not passivation capable'. I'm not sure whether this is relevant since Serialization is not the same as passivation.

 

I tried to set the entityRepository field to transient, but that results in the same error.

 

If I try to replace the @Inject with @EJB the error becomes:

0000003a JspStateManag E   Exiting serializeView - Could not serialize state: com.ibm.ejs.container.EJSContainer

  java.io.NotSerializableException: com.ibm.ejs.container.EJSContainer

 

My application context:

JSF 2.0, Websphere 8 (OpenWebbeans), Seam Faces

 

Thanks for replying your ideas and solutions.

Kind regards,

 

Kris

  • 1. Re: (NotSerializableException) ViewScoped bean with reference to stateless session bean
    zeeman Novice

    Can you make EntityRepository serializable?

     

    I have Viewscoped beans that use stateless EJBs without issues.

  • 2. Re: (NotSerializableException) ViewScoped bean with reference to stateless session bean
    pintail Newbie

    Hi Zeeman,

     

    What do you mean?

    I already have 'EntityRepository implements Serializable'.

     

    Kind regards,

     

    Kris

  • 3. Re: (NotSerializableException) ViewScoped bean with reference to stateless session bean
    zeeman Novice

    Can you post your complete stackstrace including caused by clauses?

     

    Just for kicks, have you tried deploying your app in As7.1?

  • 4. Re: (NotSerializableException) ViewScoped bean with reference to stateless session bean
    pintail Newbie

    I have further investigated this issue. I now know where the NotSerializableException comes from, but I can't explain why this occurs nor how to solve it.

     

    Let me try to explain what happens:

     

    On Websphere 8.0.0.3, I have a filterable overview screen (JSF/MyFaces) supported by a SearchController in ViewScope (Seam Faces). This SearchController maintains state throughout the view and is Serializable. In order to query and filter the database, the controller uses a stateless EJB PersonRepository. This PersonRepository is injected in the controller (CDI/OpenWebbeans). The repository is not serializable, since it doesn't make sense because it is stateless and because it contains a reference to JPA (entitymanager, datasource, ...). Since PersonRepository is not serializable, the field is marked transient. The code:

     

    @Named

    @ViewScoped

    public class SearchController implements Serializable {

                @Inject private transient PersonRepository personRepository;

    }

     

    @Stateless

    public class PersonRepository {

     

    }

     

    When I try to access my search page, I get the following stacktrace:

     

    [28/06/12 13:34:16:852 CEST] 00000067 JspStateManag E   Exiting serializeView - Could not serialize state: domain.EJSLocalNSLPersonRepository_ad8f34be

                                     java.io.NotSerializableException: domain.EJSLocalNSLPersonRepository_ad8f34be

          at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)

          at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)

          at org.apache.webbeans.ejb.common.proxy.EjbBeanProxyHandler.writeExternal(EjbBeanProxyHandler.java:422)

          at java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1449)

          at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1418)

          at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)

          at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1537)

          at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1502)

          at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1420)

          at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)

          at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)

    (4)   at org.apache.webbeans.context.creational.DependentCreationalContext.writeObject(DependentCreationalContext.java:111)

          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)

          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)

          at java.lang.reflect.Method.invoke(Method.java:611)

          at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1012)

          at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1488)

          at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1420)

          at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)

          at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)

          at java.util.ArrayList.writeObject(ArrayList.java:720)

          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)

          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)

          at java.lang.reflect.Method.invoke(Method.java:611)

          at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1012)

          at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1488)

          at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1420)

          at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)

          at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)

          at java.util.HashMap.writeObject(HashMap.java:861)

          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)

          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)

          at java.lang.reflect.Method.invoke(Method.java:611)

          at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1012)

          at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1488)

          at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1420)

          at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)

          at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)

    (3)   at org.apache.webbeans.context.creational.CreationalContextImpl.writeObject(CreationalContextImpl.java:396)

          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)

          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)

          at java.lang.reflect.Method.invoke(Method.java:611)

          at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1012)

          at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1488)

          at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1420)

          at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)

          at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)

          at java.util.concurrent.ConcurrentHashMap.writeObject(ConcurrentHashMap.java:1258)

          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)

          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)

          at java.lang.reflect.Method.invoke(Method.java:611)

          at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1012)

          at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1488)

          at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1420)

          at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)

          at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)

    (2)   at java.util.HashMap.writeObject(HashMap.java:861)

          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)

          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)

          at java.lang.reflect.Method.invoke(Method.java:611)

          at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1012)

          at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1488)

          at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1420)

          at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)

          at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1366)

          at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)

          at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1366)

          at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)

          at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)

          at org.apache.myfaces.application.jsp.JspStateManagerImpl.serializeView(JspStateManagerImpl.java:814)

          at org.apache.myfaces.application.jsp.JspStateManagerImpl.saveSerializedViewInServletSession(JspStateManagerImpl.java:699)

    (1)   at org.apache.myfaces.application.jsp.JspStateManagerImpl.saveSerializedView(JspStateManagerImpl.java:497)

          at javax.faces.application.StateManager.saveView(StateManager.java:114)

          at org.apache.myfaces.application.jsp.JspStateManagerImpl.saveView(JspStateManagerImpl.java:460)

          at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1335)

          at org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:263)

          at com.ocpsoft.pretty.faces.application.PrettyViewHandler.renderView(PrettyViewHandler.java:163)

          at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:59)

          at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:59)

          at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:85)

          at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:239)

          at javax.faces.webapp.FacesServlet.service(FacesServlet.java:191)

          at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1214)

          at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:774)

          at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:456)

          at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)

          at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:125)

          at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:92)

          at com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:145)

          at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:192)

          at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:89)

          at org.jboss.solder.servlet.exception.CatchExceptionFilter.doFilter(CatchExceptionFilter.java:62)

          at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:192)

          at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:89)

          at org.jboss.solder.servlet.event.ServletEventBridgeFilter.doFilter(ServletEventBridgeFilter.java:74)

          at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:192)

          at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:89)

          at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:926)

          at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1023)

          at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:87)

          at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:895)

          at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)

          at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:195)

          at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:452)

          at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:511)

          at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:305)

          at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83)

          at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)

          at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)

          at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)

          at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)

          at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)

          at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)

          at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)

          at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1659)

     

    (1) org.apache.myfaces.application.jsp.JspStateManagerImpl wants to serialize the viewRoot.

    This viewRoot contains two maps, put there by org.jboss.seam.faces.context.ViewScopedContext:

    org.jboss.seam.faces.viewscope.componentInstanceMap={org.apache.webbeans.container.SerializableBean@41776b62=web.controller.SearchController@1e0f7bbc}

    => This map contains the actual component for every CDI bean in view scope.

    org.jboss.seam.faces.viewscope.creationalInstanceMap={org.apache.webbeans.container.SerializableBean@41776b62=org.apache.webbeans.context.creational.CreationalContextImpl@1e099b4a}

    => This map contains the creational context for every CDI bean in view scope.

     

    (2) In order to serialize the ViewRoot, the two hashMaps are serialized

     

    (3) Here he starts to serialize the creational context of my SearchController. This org.apache.webbeans.context.creational.CreationalContextImpl has the following fields:

    contextual: [1098345314,Name:searchController,WebBeans Type:MANAGED,API Types:[java.lang.Object,java.io.Serializable,web.controller.SearchController],Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default,javax.inject.Named]]

    => This is information on my CDI bean searchController

    dependentObjects: web.controller.SearchController@1e0f7bbc=[org.apache.webbeans.context.creational.DependentCreationalContext@1e10b3b0]

     

    (4) Here he wants to serialize this DependentCreationalContext: org.apache.webbeans.context.creational.DependentCreationalContext with fields:

    contextual: WSEjbBean [businessLocals=[class domain.PersonRepository], ejbName=PersonRepository-784528839,Name:null,WebBeans Type:ENTERPRISE,API Types:[java.lang.Object,domain.PersonRepository],Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default]

    depedentType: DependentCreationalContext$DependentType.BEAN

    instance: PersonRepository_$$_javassist_29 - domain.EJSLocalNSLPersonRepository_ad8f34be@dae4cfc6

     

    Finally he tries to serialize the instance field which refers to a dynamic EJB/CDI proxy which is not serializable, resulting in the NotSerializableException.

     

    This explains the where the exception comes from.

    Now the question is: why and how to prevent/solve this?

     

    Kind regards and thanks in advance for all help!

     

    Kris


  • 5. Re: (NotSerializableException) ViewScoped bean with reference to stateless session bean
    pintail Newbie

    I hope my post was not to long to read, just wanted to give all intel I have.

  • 6. Re: (NotSerializableException) ViewScoped bean with reference to stateless session bean
    zeeman Novice

    I don't know. But if I were you, I would simplify the objects used, add fields as needed until you know exactly what's causing it to break. Obviously you have an object that's not serializiable.

  • 7. Re: (NotSerializableException) ViewScoped bean with reference to stateless session bean
    pintail Newbie

    I was able to resolve it some time ago.

    I think this was the solution:

     

    In web.xml set:

     

    <context-param>

      <description>DISABLE SERIALIZE IN ORDER TO MAKE @ViewScoped (Seam) work</description>

              <param-name>org.apache.myfaces.SERIALIZE_STATE_IN_SESSION</param-name>

              <param-value>false</param-value>

    </context-param>