I have obtained the latest Grails 2.0 milestone, and I am seeing a deprecation warning for the ConfigurationHolder
class:
org.codehaus.groovy.gr
you can inject "grailsApplication" into your source file. here is a sample conf/Bootstrap.groovy
class BootStrap {
def grailsApplication
def init = { servletContext ->
println grailsApplication.config
}
def destroy = {
}
}
You can access grails configuration
In Controller
class DemoController {
def grailsApplication
def demoAction = {
def obj = grailsApplication.config.propertyInConfig
}
}
In services :
class DemoService {
def grailsApplication
def demoMethod = {
def obj = grailsApplication.config.propertyInConfig
}
}
In taglib :
class DemoTaglib {
def grailsApplication
static namespace = "cd"
def demoMethod = {
def obj = grailsApplication.config.propertyInConfig
out << obj
}
}
You can call this method of taglib in view as <cd:demoMethod/>
In view :
<html>
<head><title>Demo</title></head>
<body>
${grailsApplication.config.propertyInConfig}
</body>
</html>
Another non-deprecated way to get the config is:
ApplicationContext context = ServletContextHolder.servletContext.
getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT)
as ApplicationContext
ConfigObject config = context.getBean(GrailsApplication).config
This works in situations where there is no injected parent available, such as servlet classes or static methods.
If you need it in an artifact that supports dependency injection, simply inject grailsApplication
class MyController {
def grailsApplication
def myAction = {
def bar = grailsApplication.config.my.property
}
}
If you need it in a bean in, say, src/groovy
or src/java
, wire it up using conf/spring/resources.groovy
// src/groovy/com/example/MyBean.groovy
class MyBean {
def grailsApplication
def foo() {
def bar = grailsApplication.config.my.property
}
}
// resources.groovy
beans = {
myBean(com.example.MyBean) {
grailsApplication = ref('grailsApplication')
// or use 'autowire'
}
}
Anywhere else, it's probably easiest to either pass the configuration object to the class that needs it, or pass the specific properties that are needed.
// src/groovy/com/example/NotABean.groovy
class NotABean {
def foo(def bar) {
...
}
}
// called from a DI-supporting artifact
class MyController {
def grailsApplication
def myAction = {
def f = new NotABean()
f.foo(grailsApplication.config.my.property)
}
}
Update:
Burt Beckwith recently wrote a couple of blog posts on this. One discusses using getDomainClass()
from within domain classes, while the other offers the option of creating your own holder class (if none of the solutions above are appropriate).
To access from domain class do:
import grails.util.Holders
// more code
static void foo() {
def configOption = Holders.config.myProperty
}
An alternative to grailsApplication is the Holders class,
import grails.util.Holders
def config = Holders.config
You get config directly off of Holders, no injection needed, which is nice for utility classes, etc.