grails - 如何将新标签注入(inject) TagLib?

标签 grails groovy metaprogramming

假设我的 conf/InjectionConfig.groovy 中有以下配置文件:

x {
    a = { attrs, body -> out << "hello" }
    b = { attrs, body ->  out << "goodbye" }
}

并且我有一个简单的标签库,例如
class XTagLib {
    static namespace = "x"
}

我想要做的是当我输入 <x:a />根据我的任何观点,它将打印 hello .我已经尝试将这些作为属性和方法注入(inject)到 taglib 的元类中,但似乎都不起作用。例如,这基本上是我现在在服务中所做的:
public void afterPropertiesSet() throws Exception {
    GroovyClassLoader classLoader = new GroovyClassLoader(getClass().classLoader)
    def slurper = new ConfigSlurper(GrailsUtil.environment)
    ConfigObject xConfig
    try {
        xConfig = slurper.parse(classLoader.loadClass('InjectionConfig'))
    }
    catch (e) {
        e.printStackTrace()
    }
    xConfig.x.each({
        if ( !XTagLib.metaClass.hasMetaProperty(it.key) ) {
            XTagLib.metaClass.registerBeanProperty(it.key, { args ->
                def attrs = args[0], body = args[1]
                it.value.call(attrs, body)
            }
        }
    })
}

我只是做错了,还是目前这可能?

最佳答案

嗯,这个

    def shell = new GroovyShell() // or get a GroovyClassLoader
    Class yTagLibClass = shell.evaluate("class YTagLib { static namespace = 'x' }; return YTagLib")

    yTagLibClass.metaClass.a = { attrs, body -> delegate.out << 'blabla' }
    grailsApplication.addArtefact(TagLibArtefactHandler.TYPE, yTagLibClass)

几乎为我工作 - 注册了一个标签,除了它没有输出任何东西。你仍然需要解决 out针对 Grails 的 taglib 的 out属性(property)。

我看不出有什么好方法,因为无法访问实例变量,并且 out是一个实例变量。请参阅 Grails 源代码 JspInvokeGrailsTagLibTag.doStartTagInternal() - 您可能会找到一种方法。

编辑 : 我加了delegate.应该解析 out 的前缀目标对象的属性。现在我相信我应该被接受:)

关于grails - 如何将新标签注入(inject) TagLib?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4051195/

相关文章:

functional-programming - 如何在对象的多个方法上使用 functools.partial 并无序卡住参数?

c++ - 如何使用 BOOST BinaryFunction 概念?

unit-testing - 如何模拟 Grails 中 'src' 文件夹中的类(单元测试)

javascript - Grails - 在脚本方法之后调用正文加载

java - 关闭命令窗口时如何在生产模式下启动 grail 应用程序而不终止 session ?

json - 从控制台到导入Grails转换器的挣扎

facebook-graph-api - Facebook Graph API帖子错误地显示了一些消息字符

grails - 如何使用oscache配置grails1.2?

java - 在 Java 属性中使用 Groovy 进行变量扩展

c++ - 在Boost Phoenix中获取局部变量的类型