【问题标题】:Access grailsApplication or Service in groovy class在 groovy 类中访问 grailsApplication 或 Service
【发布时间】:2013-01-17 08:03:59
【问题描述】:

我试图在src/groovy 下的groovy 类中访问grailsApplication,但我得到一个空指针异常。我还尝试将服务注入同一个类和相同的结果。如何访问grailsApplication 或 groovy 类的服务? (我使用的是 Grails 1.3.7)

【问题讨论】:

标签: grails service groovy


【解决方案1】:

ApplicationHolder 类在较新的 Grails 版本(2.0 及更高版本)中已弃用。

还有另一种方式,在 Burt 的一篇博文中有所描述:http://burtbeckwith.com/blog/?p=1017

【讨论】:

  • 我想知道为什么他们弃用了他们的持有人,然后告诉我们写我们自己的持有人。如果模式没有缺陷,他们为什么不直接修复他们的实现?
  • 博文经常被删除 - 为了后代着想,请在帖子中包含实际答案,而不仅仅是链接!
【解决方案2】:

在 Grails 2.0 之后,你应该使用:

 def grailsApplication = Holders.grailsApplication

【讨论】:

    【解决方案3】:

    依赖注入不适用于src/groovy 下的 groovy 类。您可以像这样使用ApplicationHolder 访问grailsApplication

    import org.codehaus.groovy.grails.commons.ApplicationHolder
    
    def grailsApplication = ApplicationHolder.application
    

    您可以像这样访问所有服务:

    def allServicesArtefacts = grailsApplication.services
    

    【讨论】:

    • 对于 grails 1.3.7 这是一个完美的解决方案。但是对于 grails v2+,您应该使用 Tobias Kraft 的解决方案。
    【解决方案4】:

    如果你有想要参与来自 src/groovy 或 src/java 甚至 3rd 方 jar 的依赖注入的类,你所要做的就是在 grails-app/conf/spring/resources.groovy 中配置它们。

    如果你的 src/groovy 目录中有类 mypackage.MyClass,如下所示:

    package mypackage
    class MyClass{
        def grailsApplication
        def myMethod(){
            //uses grailsApplication
        }
    }
    

    然后通过将以下内容添加到 grails-app/conf/spring/resoruces.groovy 它将自动注入:

    myClass(mypackage.MyClass){bean->
        bean.autowire = "byName"    
    }
    

    到目前为止,这适用于任何版本的 grails,就像我说的你甚至可以使用 3rd 方 jars - 例如,我的 resources.groovy 中总是有以下内容:

    jdbcTemplate(org.springframework.jdbc.core.JdbcTemplate){
        dataSource = ref('dataSource')
    }
    

    有关更全面的 Spring/Grails 文档,请参阅:

    http://grails.github.io/grails-doc/latest/guide/spring.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      相关资源
      最近更新 更多