在groovy类中访问grailsApplication或Service

在groovy类中访问grailsApplication或Service,grails,service,groovy,Grails,Service,Groovy,我试图访问src/groovy下groovy类中的grailsApplication,但是我得到了一个空指针异常。我还尝试将一个服务注入到同一个类中,得到相同的结果。如何从groovy类访问grailsApplication或服务?(我使用的是Grails1.3.7)依赖项注入不适用于src/groovy下的groovy类。您可以使用ApplicationHolder访问grailsApplication,如下所示: import org.codehaus.groovy.grails.commo

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

依赖项注入不适用于
src/groovy
下的groovy类。您可以使用
ApplicationHolder
访问
grailsApplication
,如下所示:

import org.codehaus.groovy.grails.commons.ApplicationHolder

def grailsApplication = ApplicationHolder.application
def allServicesArtefacts = grailsApplication.services
package mypackage
class MyClass{
    def grailsApplication
    def myMethod(){
        //uses grailsApplication
    }
}
您可以访问以下所有服务:

import org.codehaus.groovy.grails.commons.ApplicationHolder

def grailsApplication = ApplicationHolder.application
def allServicesArtefacts = grailsApplication.services
package mypackage
class MyClass{
    def grailsApplication
    def myMethod(){
        //uses grailsApplication
    }
}

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


还有另一种方法,这在Burt的一篇博客文章中有描述:

如果您有一些类希望参与来自src/groovy或src/java甚至第三方jar的依赖注入,那么您所要做的就是在grails app/conf/spring/resources.groovy中配置它们

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

import org.codehaus.groovy.grails.commons.ApplicationHolder

def grailsApplication = ApplicationHolder.application
def allServicesArtefacts = grailsApplication.services
package mypackage
class MyClass{
    def grailsApplication
    def myMethod(){
        //uses grailsApplication
    }
}
然后,通过将以下内容添加到grails app/conf/spring/resoruces.groovy,它将自动注入:

myClass(mypackage.MyClass){bean->
    bean.autowire = "byName"    
}
这将适用于任何版本的grails thusfar,正如我所说,您甚至可以使用第三方JAR—例如,我的参考资料中始终包含以下内容。groovy:

jdbcTemplate(org.springframework.jdbc.core.JdbcTemplate){
    dataSource = ref('dataSource')
}
有关更全面的Spring/Grails文档,请参见:


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

 def grailsApplication = Holders.grailsApplication

Grails1.3.7的可能副本这是一个完美的解决方案。然而,对于GrailsV2+来说,您应该使用TobiasKraft的解决方案。我想知道为什么他们不推荐他们的持有者,然后告诉我们编写我们自己的持有者。如果模式没有缺陷,为什么他们不修复他们的实现呢?博客文章经常被删除——为了子孙后代,请在你的文章中包含实际答案,而不仅仅是一个链接!