2012-12-14 55 views
5

如何初始化一個static變量,其值爲config.groovy中定義的值?Grails:使用config.groovy中定義的值初始化一個靜態變量

目前,我有這樣的事情:

class ApiService { 
    JSON get(String path) { 
     def http = new HTTPBuilder("${grailsApplication.config.grails.api.server.url}") 
     ... 
    } 
    JSON get(String path, String token) { 
     def http = new HTTPBuilder("${grailsApplication.config.grails.api.server.url}") 
     ... 
    } 
    ... 
    JSON post(String path, String token) { 
     def http = new HTTPBuilder("${grailsApplication.config.grails.api.server.url}") 
     ... 
    } 
} 

我不想定義每個方法裏面http變量(幾個GET,POST,PUT和DELETE)。

我想在該服務中將http變量作爲static變量。

我想這沒有成功:

class ApiService { 

    static grailsApplication 
    static http = new HTTPBuilder("${grailsApplication.config.grails.api.server.url}") 

    JSON get(String path) { 
     http.get(...) 
     ... 
    } 
} 

我得到Cannot get property 'config' on null object。同樣有:

class ApiService { 

    def grailsApplication 
    static http 

    ApiService() { 
     super() 
     http = new HTTPBuilder("${grailsApplication.config.grails.api.server.url}") 
    } 

    JSON get(String path) { 
     http.get(...) 
     ... 
    } 
} 

我也試過沒有static定義,但同樣的錯誤Cannot get property 'config' on null object

class ApiService { 

    def grailsApplication 
    def http 

    ApiService() { 
     super() 
     http = new HTTPBuilder("${grailsApplication.config.grails.api.server.url}") 
    } 
} 

任何線索?

回答

14

而不是一個靜態,使用一個實例屬性(因爲服務bean是單身作用域)。你不能在構造函數中進行初始化,因爲依賴關係還沒有被注入,但是你可以使用註釋爲@PostConstruct的方法,在依賴注入之後這個方法將被框架調用。

import javax.annotation.PostConstruct 

class ApiService { 
    def grailsApplication 
    HTTPBuilder http 

    @PostConstruct 
    void init() { 
    http = new HTTPBuilder(grailsApplication.config.grails.api.server.url) 
    } 

    // other methods as before 
} 
+0

謝謝伊恩!奇蹟般有效 :) – Agorreca