2011-05-04 74 views
0

我想在另一個服務的構造函數中注入一個服務依賴項(請參閱下面的示例代碼)。但是,當我嘗試分配api變量時,即使正確設置了bean變量,也會引發NoSuchBeanDefinitionException異常。如何通過構造函數在服務中手動注入依賴項?

值得一提的是,當我擴展此服務並初始化子服務時會發生這種情況。

我的問題是,我怎麼才能正確地注入依賴項服務到我的課,取決於我的Config.groovy中的設置?

class MyService { 
def api 

public MyService() { 
def beanString = ConfigurationHolder.config.api 
def bean = ApplicationHolder.application.getMainContext().getBean(GrailsNameUtils.getPropertyName(beanString)) 
this.api = bean 
} 
} 

編輯:爲了澄清我的想法。我有兩個API:s,一個XML和一個JSON,它們提供相同的數據,但具有不同的表示形式。但是,我希望能夠將api設置爲在配置文件中使用,例如,帶有api-name的字符串。

我的想法是爲可用的apis(ApiInterface)提供一個通用接口,然後在使用api的服務初始化時,將實例變量設置爲配置的api。

除此之外,我希望能夠具有服務特定的設置,即每個配置文件中注入api的服務的設置,以設置使用哪個api。 例如


Config.groovy

firstService { api = "xml" } secondService { api = "json" }

回答

0

我懷疑你可以在沒有很多麻煩的情況下工作,因爲實例是在構建bean時由Spring創建的,所以其他bean可能還沒有可用。您可以在第一次請求時懶洋洋地查看它:

class MyService { 

    def grailsApplication 

    private apiBean // use different name so 'api' resolves as property to getApi() 

    def someMethod() { 
     def foo = api.someMethodCall() 
     ... 
    } 

    def someOtherMethod() { 
     def bar = api.someOtherMethodCall() 
     ... 
    } 

    private getApi() { 
     if (apiBean == null) { 
     String beanString = grailsApplication.configuration.api 
     apiBean = grailsApplication.mainContext.getBean(
       GrailsNameUtils.getPropertyName(beanString)) 
     } 
     apiBean 
    } 
} 
+0

非常感謝。懶惰的查找做了詭計! – 2011-05-04 21:03:15

0

沒有太多的信息可以繼續。是否在創建MyService時明確創建的config.api屬性中定義的bean?你如何保證?

我認爲你可以做一些延遲初始化繞過它也許是:

class MyService { 
    static class ApiBeanHolder { 
     static api = ApplicationHolder.application.getMainContext().getBean(GrailsNameUtils.getPropertyName(ConfigurationHolder.config.api)) 
    } 

    def doSomeWork = { 
     def bean = ApiBeanHolder.api 
     bean.callBeanMethod 
    } 
} 

沒有測試,不知道這是否解決您的特定問題。

+0

感謝您的回覆。但是,這並不能完全解決我的問題,因爲ApiBeanHolder.api對於擴展MyService的所有服務都是相同的,我需要根據子服務設置api變量。看到我編輯的問題。 – 2011-05-04 12:40:13

相關問題