0

I just converted my Beans to be ViewScoped instead of RequestScoped. However, since I had to add Serialized to those beans, I am getting two java.io.NotSerializableException exceptions.

This is my web.xml:

<filter>
  <filter-name>PrimeFaces FileUpload Filter</filter-name>
  <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter>
   <filter-name>loginFilter</filter-name>
   <filter-class>com.company.rews.webclient.controller.LoginFilter</filter-class>
</filter>

<servlet>
  <servlet-name>Faces Servlet</servlet-name>
  <servlet-class>com.company.rews.webclient.controller.MyFacesServletWrapper</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

The first place it reports this exception is somewhere inside super.service(req, res):

public class MyFacesServletWrapper extends MyFacesServlet 
{

@Override
public void service(ServletRequest request, ServletResponse response)
        throws IOException, ServletException
{
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;        

    req.setCharacterEncoding("UTF-8");
    res.setCharacterEncoding("UTF-8");        

    try
    {   
        super.service(req, res);        
    }
    catch (ServletException e)
    {           
        e.printStackTrace();
        LoginFilter.gotoLogin(e, req, res);
    }        
}

}

And here at chain.doFilter(request, response):

public class LoginFilter implements Filter
{
 private static final String SYSTEM_ERROR_URI = "/login.faces";
 private static final String VIEWEX_ERROR_URI = "/login.faces";

@Override
public void doFilter( ServletRequest req, ServletResponse res, FilterChain chain ) throws IOException, ServletException
{

    HttpServletRequest  request  = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    if ( isResourceRequest(request, response) )
    {
        chain.doFilter(request, response);
    }
    else if ( !isLoggedIn(request, response) && isLoginArea(request, response) )
    {
        gotoLogin(null, request, response);
    }
    else if( !isUserConnectedToREWS( request ) && isLoginArea(request, response) )
    {
        gotoLogin(null, request, response);
    }
    else
    {
        chain.doFilter(request, response);
    }

}

Here is the complete error report:

08.05.2013. 18:03:47 org.apache.myfaces.renderkit.ServerSideStateCacheImpl serializeView
SEVERE: Exiting serializeView - Could not serialize state: org.apache.myfaces.context.servlet.ServletExternalContextImpl
java.io.NotSerializableException: org.apache.myfaces.context.servlet.ServletExternalContextImpl
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
at java.util.HashMap.writeObject(HashMap.java:1001)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
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:1469)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1346)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1154)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
at java.util.HashMap.writeObject(HashMap.java:1001)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
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:1469)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1346)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1154)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
at org.apache.myfaces.renderkit.ServerSideStateCacheImpl.serializeView(ServerSideStateCacheImpl.java:390)
at org.apache.myfaces.renderkit.ServerSideStateCacheImpl.saveSerializedViewInServletSession(ServerSideStateCacheImpl.java:240)
at org.apache.myfaces.renderkit.ServerSideStateCacheImpl.saveSerializedView(ServerSideStateCacheImpl.java:872)
at org.apache.myfaces.renderkit.html.HtmlResponseStateManager.saveState(HtmlResponseStateManager.java:144)
at org.apache.myfaces.application.StateManagerImpl.saveView(StateManagerImpl.java:195)
at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1971)
at org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:285)
at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:115)
at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:241)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:199)
at org.apache.myfaces.webapp.MyFacesServlet.service(MyFacesServlet.java:112)
at com.mainconcept.rews.webclient.controller.MyFacesServletWrapper.service(MyFacesServletWrapper.java:30)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.company.rews.webclient.controller.LoginFilter.doFilter(LoginFilter.java:54)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)

How do I exclude servlet-filters from having to be serialized if that's the problem here at all?

Danijel
  • 8,198
  • 18
  • 69
  • 133
  • 2
    Why exactly do you think that `org.apache.myfaces.context.servlet.ServletExternalContextImpl` is one of your filters? It's just MyFaces' implementation of `ExternalContext` which is been used when you're running JSF on a servlet environment (instead of portlet environment). This in turn suggests that you're somewhere incorrectly assigning `ExternalContext` as a property of a backing bean which needs to be serializable. – BalusC May 08 '13 at 16:29
  • 2
    By the way, the job which `MyFacesServletWrapper` is doing can better be done by a filter. – BalusC May 08 '13 at 16:31
  • OK, I made class member `FacesContext` to be `transient` and now it works. I am still not sure if this is right thing to do...? Maybe I could make `FacesContext` static or...? – Danijel May 09 '13 at 09:32
  • You should **never** make it an instance variable. It has a lifetime of one HTTP request. You should absolutely not make it an instance variable of a class which lives longer than that. – BalusC May 09 '13 at 11:25

1 Answers1

1

Just stop assigning FacesContext, ExternalContext and all of its artifacts as an instance variable. You should always, always obtain and assign them in thread local scope (i.e. inside the method block).

See also:


Please note that this all has nothing to do with servlet filters.

Community
  • 1
  • 1
BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555