3

私はGrailsコミュニティに比較的慣れていませんが、エンジンが提供するものはすでに気に入っています。現在、ページの標準デザインを簡単に行えるように、カスタムタグライブラリを実装しています。ただし、ユーティリティの目的(データのフィルタリングなど)でヘルパー関数を呼び出したり、タグに関するリクエストレベルのメタデータ(カウンター、親子関係など)を隠したりする方法が必要です。

私は2つの解決策を試みました:

最初に:サービスを作成し、そのスコープを「リクエスト」に設定しました

package myapp

class CustomTagService {
    static scope = 'request'
    def data = []

    def add(localData) {
        data.add(localData)
    }
}

ただし、タグライブラリに挿入しようとすると

package myapp

class MyTagLib {
    def customTagService

    def myTag = { attrs, body ->
        customTagService.add(attrs)
    }

}

エンジンは、リクエストスコープを参照するように私に怒鳴ります(長い苦痛なスタックトレースの後):「スコープ'リクエスト'は現在のスレッドに対してアクティブではありません。シングルトンから参照する場合は、このBeanのスコーププロキシを定義することを検討してください。」

2番目:pageScopeはタグクロージャー内で使用できることを理解しており、以前にそれを利用したことがあります。ただし、私が望んでいる構造では、カプセル化がはるかに望ましいでしょう。

私がこれで間違った道を進んでいるなら、私に知らせてください。任意の提案をいただければ幸いです!

4

1 に答える 1

8

シングルトンBean(taglibsを含む)は、アクティブなリクエストがない場合の起動時に作成されるため、スコープ付きBeanをシングルトンBeanで使用することはできません。代わりに、スコープ付きプロキシ(少し複雑)を使用するかApplicationContext、アクティブなリクエストがある場合、実行時に使用するたびにからBeanを取得します。

package myapp

class MyTagLib {

   def grailsApplication

   def myTag = { attrs, body ->
      customTagService.add(attrs)
   }

   private getCustomTagService() {
       grailsApplication.mainContext.customTagService
   }
}
于 2012-10-03T18:37:37.690 に答える