私は、この種の目的でセッション スコープのサービスを使用するのが好きです。このアプローチでは、セッション スコープのサービスのプロキシをグローバル スコープのサービス (またはコントローラー) に挿入します。つまり、セッションに入れたものを追跡することを心配する必要はありません。
ここには、スコープの異なるサービスを混在させる方法を示す素敵な小さなチュートリアルがあります。また、そのチュートリアルの作成者は、プロセスを簡単にするプラグインも作成しているようです (ただし、実際にプラグインを試したことはありません)。
編集:
これを設定し、実際にサービス プロキシを使用してビューにデータを渡す方法を示す例を次に示します。
ユーザーのショッピング カートなど、セッション スコープのものを保持するサービスを作成します。これは単なる通常のサービス (他のサービスなどを参照する) ですが、セッション固有のものをメンバー変数として保存できます -
class MySessionScopedService {
def currentUser
def shoppingCart
...
}
でresources.groovy
、サービスのセッション スコープのプロキシを設定します。他のサービスに直接注入するのではなくMySessionScopedService
、プロキシを注入します。
beans = {
mySessionScopedServiceProxy(org.springframework.aop.scope.ScopedProxyFactoryBean) {
targetBeanName = 'mySessionScopedService'
proxyTargetClass = true
}
}
最後に、サービスを参照する場合は、プロキシを参照します (mySessionScopedServiceProxy
ではなく参照していることに注意してくださいmySessionScopedService
)。グローバルスコープのコンポーネントでプロキシを参照でき、実行時にSpringは現在のセッションに正しいものを挿入します。
class MyController {
def mySessionScopedServiceProxy
def someOtherService
def index() {
[shoppingCart: mySessionScopedServiceProxy.shoppingCart, currentUser: mySessionScopedServiceProxy.currentUser]
}
}