0

カスタム クラス UserProfile を使用して Google アプリ エンジンでセッションを管理していますが、エラーが発生します (ユーザーがアプリのデフォルト サーブレットにアクセスした場合):

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 の「クリア」が機能するはずです)。

編集:memcache全体をクリアすると、ユーザーセッションが無効になりますか?

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

上記の例外をキャッチしてユーザーのセッションを無効にできるように、オーバーライドできる初期サーブレットのメソッドはありますか?

4

1 に答える 1

0

はい、このエラーを回避するには明示的な serialVersionUID 値を提供する必要があります。デプロイメント間または/およびクラス変更間で値を同じに保つことができます。

既存のユーザーについては、GAE のバージョン管理機能を使用できます。既存の GAE アプリ v. 1 など、バージョンを上げてデプロイするので、新しいコードを v.2 としてデプロイしてから、デフォルト バージョンを新しいバージョンに再ポイントできます...そのため、既存のユーザーは引き続き古いバージョンを使用します...しかし、新しいものはヒット新ver.

于 2013-03-28T16:48:49.770 に答える