3

我对 Grails 社区比较陌生,但我已经喜欢该引擎所提供的功能。目前,我正在实现一个自定义标签库,以便轻松地在我们的页面上进行标准设计。但是,为了实用目的(例如过滤数据)和存储关于我的标签的请求级元数据(例如计数器、父/子关系),我需要一种调用辅助函数的方法。

我尝试了两种解决方案:

首先:我创建了一个服务,将其范围设置为“请求”

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 定义一个范围代理

第二:我知道 pageScope 在标签闭包内可供我使用,并且我之前已经利用过它。但是,对于我想要的结构,封装将是更可取的。

如果我走错了路,请告诉我。我们欢迎所有的建议!

4

1 回答 1

8

您不能在单例 bean 中使用作用域 bean,因为单例 bean(包括标记库)是在启动时在没有活动请求时创建的。而是使用作用域代理(有点复杂),或者ApplicationContext在有活动请求时在运行时从 for each use 获取 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 回答