grails - 我将如何覆盖 taglib bean 中的方法?

标签 grails grails-plugin grails-3.3

我正在尝试迁移 grails-timezone-detection Grails 3 的 grails 插件。

在原始代码中有以下方法:

private def getDefaultFormTagLib() {
    return grailsApplication.mainContext.getBean('org.codehaus.groovy.grails.plugins.web.taglib.FormTagLib')
}

我重写如下:
private def getDefaultFormTagLib() {
    return grailsApplication.mainContext.getBean('org.grails.plugins.web.taglib.FormTagLib')
}

运行测试,我收到以下错误:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.grails.plugins.web.taglib.FormTagLib' available
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:687)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1207)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:284)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1078)
at com.captivatelabs.grails.timezone.detection.TimeZoneTagLib.getDefaultFormTagLib(TimeZoneTagLib.groovy:76)
at com.captivatelabs.grails.timezone.detection.TimeZoneTagLib$_closure3.doCall(TimeZoneTagLib.groovy:42)
at groovy.lang.Closure.call(Closure.java:414)
at org.grails.taglib.TagOutput.captureTagOutput(TagOutput.java:64)
at com.captivatelabs.grails.timezone.detection.TimeZoneTagLibSpec.test offset server to client time - datePicker(TimeZoneTagLibSpec.groovy:85)

我添加了以下内容以输出插件可用的 bean:
def ctx = grailsApplication.mainContext
ctx.beanDefinitionNames.sort().each { println it }
org.grails.plugins.web.taglib 中唯一的 bean包是org.grails.plugins.web.taglib.ApplicationTagLib .

为什么以下内容也不可用?
  • org.grails.plugins.web.taglib.FormTagLib
  • org.grails.plugins.web.taglib.FormatTagLib

  • 我怀疑我遗漏了一些非常明显的东西。

    有人对我应该如何进行有任何建议吗?

    最佳答案

    奇怪的是它不适用于 FormTagLib因为它适用于 ApplicationTagLib :

    ApplicationTagLib g = grailsApplication.mainContext.getBean(ApplicationTagLib.class.name)
    

    话虽如此,看起来我在我的一个项目中遇到了同样的问题。这是我解决它的方法,但显然这不是最好的方法,因为依赖注入(inject)不起作用:
    private def getDefaultFormTagLib() {
        def bean = new org.grails.plugins.web.taglib.FormTagLib()
        bean.grailsTagDateHelper = new DefaultGrailsTagDateHelper()
        return bean
    }
    

    希望其他人能提出更好的答案。

    关于grails - 我将如何覆盖 taglib bean 中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49017561/

    相关文章:

    grails - 如何使用grails中目标 Controller 的参数重定向到不同 Controller 的 Action

    grails - Grails-App无法启动-ApplicationEventMulticaster未初始化

    hibernate - 从一级 hibernate Hibernate createCriteria JOIN,ORDER,DISTINCT

    json - 使用HTTPBuilder和Grails进行REST调用后出现奇怪的 “new”属性

    grails - 如何从zip安装Grails 2.4.4插件?

    grails - 如何在 Grails websocket 插件中启用跨源请求

    spring - 如何在Grails中查看用户请求的页面?

    grails - Grails 3.3-如何替换已弃用的服务伪像?

    Tomcat 7.0.57 上的 Grails 3.3.0

    grails - 嵌入Grails应用程序的ActiveMQ代理未监听外部连接