Eddard Stark
Eddard Stark

Reputation: 3595

Access grailsApplication or Service in groovy class

I am trying to access grailsApplication in groovy class under src/groovy but I get a null pointer exception. I also tried to inject a service into the same class and same result. How can I access grailsApplication or a service from groovy class? (I am using Grails 1.3.7)

Upvotes: 10

Views: 12263

Answers (4)

GSAN
GSAN

Reputation: 668

After Grails 2.0, you should use:

 def grailsApplication = Holders.grailsApplication

Upvotes: 8

Dave
Dave

Reputation: 618

If you have classes that you want to participate with dependency injection from src/groovy or src/java or even 3rd party jars all you have to do is configure them in grails-app/conf/spring/resources.groovy.

If you had the class mypackage.MyClass in your src/groovy directory that looked like this:

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

Then by adding the following to grails-app/conf/spring/resoruces.groovy it would get auto-injected:

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

This will work in any version of grails thusfar, and like I said you can even use 3rd party jars - for example I ALWAYS have the following in my resources.groovy:

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

For more comprehensive Spring/Grails documentation see:

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

Upvotes: 2

Tobias Kraft
Tobias Kraft

Reputation: 348

The ApplicationHolder class is deprecated in newer Grails versions (2.0 and above).

There is another way, which is described in one of Burt's blogposts: http://burtbeckwith.com/blog/?p=1017

Upvotes: 8

Archer
Archer

Reputation: 5147

Dependency injection does not work for groovy classes under src/groovy. You can get the access to grailsApplication using ApplicationHolder like this:

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

def grailsApplication = ApplicationHolder.application

You can access all services like this:

def allServicesArtefacts = grailsApplication.services

Upvotes: 5

Related Questions