Search code examples
javatomcat7ubuntu-16.04

Exception loading sessions from persistent storage, extended


I get

Aug 25, 2017 3:35:42 PM org.apache.catalina.session.StandardManager startInternal
SCHWERWIEGEND: Exception loading sessions from persistent storage
java.lang.ClassCastException: java.lang.String cannot be cast to java.io.ObjectStreamClass
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1511)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1997)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1921)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
        at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1608)
        at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1074)
        at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:259)
        at org.apache.catalina.session.StandardManager.load(StandardManager.java:176)
        at org.apache.catalina.session.StandardManager.startInternal(StandardManager.java:465)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5593)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:899)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1091)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1980)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)

and

((HttpSession) getContextProperty("Session")).setAttribute(name, value);

throws

Fri Aug 25 15:35:47 GMT+01:00 2017
Server Exception. ID: 72acb94e_15e19d20417_12
java.lang.NullPointerException
        at de.supportgis.gdi.gdigui.GDIApplication.setSessionAttribute(GDIApplication.java:187)
        at de.supportgis.gdi.gdigui.GDIApplication.setCurrentUserLocale(GDIApplication.java:156)
        at de.supportgis.gdi.gdigui.components.StandardContentPanel.getLS(StandardContentPanel.java:236)
        at de.supportgis.gdi.gdigui.content.Login.<init>(Login.java:68)
        at de.supportgis.gdi.gdigui.GDIApplication.init(GDIApplication.java:62)
        at nextapp.echo.app.ApplicationInstance.doInit(ApplicationInstance.java:288)
        at nextapp.echo.webcontainer.UserInstance.prepareApplicationInstance(UserInstance.java:484)
        at nextapp.echo.webcontainer.ComponentInputProcessor.process(ComponentInputProcessor.java:160)
        at nextapp.echo.webcontainer.ClientMessage.process(ClientMessage.java:194)
        at nextapp.echo.webcontainer.InputProcessor.process(InputProcessor.java:163)
        at nextapp.echo.webcontainer.Synchronization.process(Synchronization.java:121)
        at nextapp.echo.webcontainer.service.SynchronizeService.service(SynchronizeService.java:78)
        at nextapp.echo.webcontainer.WebContainerServlet.process(WebContainerServlet.java:432)
        at de.supportgis.gdi.gdigui.StartServlet.process(StartServlet.java:37)
        at nextapp.echo.webcontainer.WebContainerServlet.doPost(WebContainerServlet.java:316)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:221)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)

I guess this is no duplicate, because I checked and applied every answer in exception loading sessions from persistent storage with no luck, for example:

  • Delete /var/cache/tomcat7/Catalina/localhost/gdi/SESSIONS.ser (which is non-existent anyway if Tomcat is stopped).

I have no broken symlinks:

find / -xtype l 2>/dev/null

returns nothing relevant.


I guess it is a file system rights problem coming from an apt dist-upgrade. Do I really have to reinstall the hole server?


Solution

  • The method GDIApplication.setSessionAttribute (second stacktrace) calls getContextProperty("Session") which leads to an NPE?

    The method ApplicationInstance.getContextProperty("Session") belongs to the Echo Framework (https://github.com/echo3/echo3). I'm not exactly sure how it gets hold of the Session object, but the ClassCastException in the first stacktrace might interfere with it.

    Try replacing

    ((HttpSession) getContextProperty("Session")).setAttribute(name, value);

    with

    Connection conn = WebContainerServlet.getActiveConnection();
    conn.getRequest().getSession().setAttribute(name, value);

    This gives you access to the current ServletRequest and lets you retrieve the session using Java's ServletRequest.getSession() method, which will create the session if it doesn't yet exist.

    As for the ClassCastException during session recreation: I don't know any other way than the ones you have already tried. But if the above tip works, these exceptions may still be annoying, but could turn out to be harmless. I confess, I normally ignore them when they appear...