我对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在标签闭包中可以使用,之前我已经开发过了。但是,对于我想要的结构,封装会更受欢迎。
如果我走错了路,请告诉我。任何建议将不胜感激!
答案 0 :(得分:8)
您不能在单例bean中使用scoped bean,因为在没有活动请求的情况下,在启动时创建单例bean(包括taglib)。而是使用范围代理(有点复杂)或者只是在有活动请求时在运行时从ApplicationContext
获取bean:
package myapp
class MyTagLib {
def grailsApplication
def myTag = { attrs, body ->
customTagService.add(attrs)
}
private getCustomTagService() {
grailsApplication.mainContext.customTagService
}
}