How to access Grails configuration in Grails 2.0?

GrailsGroovyGrails 2.0

Grails Problem Overview


I have obtained the latest Grails 2.0 milestone, and I am seeing a deprecation warning for the ConfigurationHolder class:

org.codehaus.groovy.grails.commons.ConfigurationHolder

The deprecation message simply says "Use dependency injection instead" which is not very helpful to me. I understand dependency injection, but how can I wire up a bean with the proper Grails configuration so I can access it at runtime? I need to access the configuration from places other than my Controllers and Tags (such as BootStrap).

Grails Solutions


Solution 1 - Grails

  • 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).

Solution 2 - Grails

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.

Solution 3 - Grails

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 = {
    }
}

Solution 4 - Grails

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.

Solution 5 - Grails

You can access grails configuration

  1. In Controller

     class DemoController {
         def grailsApplication
    
         def demoAction = {
             def obj = grailsApplication.config.propertyInConfig
         }
     }
    
  2. In services :

     class DemoService {
         def grailsApplication
    
         def demoMethod = {
             def obj = grailsApplication.config.propertyInConfig
         }
     }
    
  3. 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/>

  1. In view :

      <html>
          <head><title>Demo</title></head>
      <body>
          ${grailsApplication.config.propertyInConfig}
      </body>
    
      </html>
    

Solution 6 - Grails

To access from domain class do:

import grails.util.Holders

// more code

static void foo() {
  def configOption = Holders.config.myProperty
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPolaris878View Question on Stackoverflow
Solution 1 - GrailsRob HruskaView Answer on Stackoverflow
Solution 2 - GrailsJames McMahonView Answer on Stackoverflow
Solution 3 - GrailsMenguView Answer on Stackoverflow
Solution 4 - GrailsIngo KegelView Answer on Stackoverflow
Solution 5 - GrailsPrabhat KashyapView Answer on Stackoverflow
Solution 6 - Grailscristian.dView Answer on Stackoverflow