Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to access Grails configuration in Grails 2.0?

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

like image 631
Polaris878 Avatar asked Aug 20 '11 17:08

Polaris878


People also ask

How do I apply for Grails?

Go to start.grails.org and use the Grails Application Forge to generate your Grails project. You can choose your project type (Application or Plugin), pick a version of Grails, and choose a Profile - then click "Generate Project" to download a ZIP file. No Grails installation necessary!


2 Answers

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

like image 82
Rob Hruska Avatar answered Sep 21 '22 05:09

Rob Hruska


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.

like image 31
James McMahon Avatar answered Sep 22 '22 05:09

James McMahon