How to access Grails configuration in Grails 2.0?

后端 未结 6 2022
青春惊慌失措
青春惊慌失措 2020-11-30 18:35

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

org.codehaus.groovy.gr         


        
相关标签:
6条回答
  • 2020-11-30 19:11

    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 = {
        }
    }
    
    0 讨论(0)
  • 2020-11-30 19:15

    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>
      
    0 讨论(0)
  • 2020-11-30 19:16

    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.

    0 讨论(0)
  • 2020-11-30 19:22
    • 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).

    0 讨论(0)
  • 2020-11-30 19:22

    To access from domain class do:

    import grails.util.Holders
    
    // more code
    
    static void foo() {
      def configOption = Holders.config.myProperty
    }
    
    0 讨论(0)
  • 2020-11-30 19:30

    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.

    0 讨论(0)
提交回复
热议问题