2016-07-08 6 views
1

私はBreadcrumbシステムを実装するGrails 3アプリケーション(3.1.1)を持っています。私はこれをGrailsの以前のバージョンのためにthis pluginに基づいています。私は構築とTomcat 7で実行した場合GrailsセッションスコープサービススローNotSerializable例外

それは(Grailsのコマンドラインコマンドrun-appを使用して)ローカルで正常に動作が、しかし、私は次の例外を取得:

Jul 08, 2016 5:10:34 PM org.apache.catalina.ha.session.DeltaManager requestCompleted 
SEVERE: Unable to serialize delta request for sessionid [6605EAC9C04DF7E2512493CABDFB1AD2] 
java.io.NotSerializableException: au.packagename.BreadCrumbService 

上記の名前のサービスは、に設定スコープを持っていますsessionであり、プロキシとして指定されています。私もSerializable実装を追加しましたが、それは役に立たないようです。

class BreadCrumbService implements Serializable { 

    static transactional = false 
    static scope = 'session' 
    static proxy = true 

} 

私はセッションにCrumbオブジェクトとして現在のコントローラとアクションを書くためにサービスを使用していますInterceptorを持っています。私はSerializableの実装を、セッションに書き込まれるCrumbBreadCrumbType Enum(Controllersアノテーションで使用される)に追加しました。

これはなぜ起こっているのかもしれないのですか(私はSerializableの概念を理解しています)、どうすればそれを解決できるのでしょうか?

+0

BreadCrumbServiceのすべてのメンバーが一時的またはシリアル化可能ですか? –

答えて

0

@HoàngLongのコメントは私に正しい軌道を与えました。

Crumbオブジェクト(すべてSerializableになっています)をセッションに書き込むときは、BreadCrumbServiceの静的変数をセッションマップのキーとして使用していました。

session[BreadCrumbService.NAMESPACE].crumb = new Crumb() 

この変数をCrumbオブジェクトに移動すると、問題は解決されました。

サービス自体はセッションに書き込まれていませんが、セッションに書き込む際にサービス内の変数を参照するだけで、サービスとすべてのメンバーがシリアライズ可能である必要がありました。

関連する問題