Grails:如何在标记库中使用请求范围的服务?

时间:2012-10-03 17:13:00

标签: grails taglib

我对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在标签闭包中可以使用,之前我已经开发过了。但是,对于我想要的结构,封装会更受欢迎。

如果我走错了路,请告诉我。任何建议将不胜感激!

1 个答案:

答案 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
   }
}