1

MyRequest各 HTTP 要求を処理するために使用されるGroovy クラス があります。コンストラクターで、このクラスはインスタンス変数を(は現在の HttpServletRequest )_sessionの値に設定します。request.getSession(true)request

私の Groovyスクリプトで最初に行うことは、 のインスタンスを作成することですMyRequest。次に、Groovletsessionオブジェクトの特定のプロパティを確認します。スクリプトへの最初のリクエストでは、このsessionオブジェクトが null であるため、null オブジェクト参照エラーが発生します。スクリプトへの 2 番目の要求では、sessionオブジェクトが定義され、エラーは発生しません。

Groovlet のドキュメントによると、この状況は予想されるはずです。これは、Groovlet のsessionオブジェクトがスクリプト内に存在することを確認した後、明示的に設定しなかったためです。

スクリプト (およびプロジェクト内の将来のスクリプト) にさらにコピー アンド ペースト コードを追加する必要はありません。これが、オブジェクトを作成した理由の 1 つです。オブジェクトをインスタンス化するスクリプトMyRequestのオブジェクトを定義するためです。では、クラス内で Groovy スクリプトsessionのオブジェクトを定義するにはどうすればよいでしょうか? オブジェクトを何らかの方法で使用できますか?sessionMyRequestmetaClass

4

1 に答える 1

0

Groovlets はすぐに使用できるセッション スコープを提供します。request.getSession() は必要ありません。

あなたのスクリプトからあなたが行う場合:

new MyRequest(session)

次に、次のようなずさんな、型指定されていない MyRequest クラスが与えられます。

class MyRequest {
    def _session
    MyRequest(sess) {
        _session = sess
    }

    def nullSafe() {
        if(_sess?.notExist) // do something...
    }
}

MyRequest メソッドはセッションを安全に参照できます (groovy の null セーフ (?) 演算子を使用する場合)。私はGroovletsから離れましたが、私が自分自身をロールバックしていたとき、Groovyの達人は、セッション、リクエスト、レスポンスなどをスクリプトスコープからオブジェクトに渡すときにスレッドローカルを使用することを提案しました...

于 2011-11-30T18:26:41.247 に答える