繁体   English   中英

Google App Engine-登录时发生InvalidClassException

[英]Google App Engine - InvalidClassException when logging in

我正在使用自定义类UserProfile来管理我在Google App Engine中的会话,但收到错误消息(当用户访问应用程序的默认Servlet时):

javax.servlet.ServletException: java.lang.RuntimeException: java.io.InvalidClassException: ro.expert.evt.shared.entities.ObjectModel; local class incompatible: 
stream classdesc serialVersionUID = -2824144882306533912, 
local class serialVersionUID = 6500787607817458947

我知道问题是我更新了我的课程,并且在部署我的应用程序时,它没有serialVersionUID。

我的问题是:

  1. 如果设置了生成的serialVersionUID,问题是否会再次出现? 每次修改用户类时,都必须重新生成它吗?

  2. 如何为我已经登录的用户解决此问题? 如何使他们的会话无效(“清除”他们的cookie应该起作用)

编辑:清除整个内存缓存会使用户会话无效吗?

我应该调用getSession()。invalidate(),但是我无法运行任何代码来捕获异常:

Caused by: java.lang.RuntimeException: java.io.InvalidClassException: ro.expert.evt.shared.entities.ObjectModel; local class incompatible: stream classdesc serialVersionUID = -2824144882306533912, local class serialVersionUID = 6500787607817458947
    at com.google.apphosting.runtime.SessionManagerUtil.deserialize(SessionManagerUtil.java:57)
    at com.google.apphosting.runtime.jetty.MemcacheSessionStore.getSession(MemcacheSessionStore.java:39)
    at com.google.apphosting.runtime.jetty.SessionManager.loadSession(SessionManager.java:327)
    at com.google.apphosting.runtime.jetty.SessionManager.getSession(SessionManager.java:301)
    at org.mortbay.jetty.servlet.AbstractSessionManager.getHttpSession(AbstractSessionManager.java:237)
    at org.mortbay.jetty.servlet.SessionHandler.setRequestedId(SessionHandler.java:246)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:136)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:266)
... 16 more

我的初始servlet中是否有可以重写的方法,以便可以捕获上述异常并使用户会话无效?

是的,您必须提供显式的serialVersionUID值以避免此错误。 您可以在部署或/和类修改之间保持相同的价值。

对于现有用户,您可以使用GAE的版本控制功能。 使用增加的版本进行部署,例如现有的GAE应用程序v.1,因此将新代码部署为v.2,然后您可以将默认版本指向新版本...这样,现有用户仍将继续使用旧版本...但是新用户将继续使用旧版本打新版本

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM