2010-03-17 101 views
14

我想在我的Grails應用程序中使用服務。但是,它始終爲空。我正在使用Grails版本1.1。我怎麼解決這個問題?在域類中使用grails服務

示例代碼:

class A{ 
     String name; 
     def testService; 
     static transients=['testService'] 
} 

我可以使用的服務的領域類裏面?

回答

24

這應該工作。請注意,由於您使用的是'def',因此您無需將其添加到瞬態列表中。你是否試圖從靜態方法訪問它?這是一個實例字段,所以你只能從實例中訪問它。

將服務注入域類的典型用例用於驗證。自定義驗證被傳遞域類的實例所驗證,所以你可以從訪問服務:

static constraints = { 
    name validator: { value, obj -> 
     if (obj.testService.someMethod(value)) { 
     ... 
     } 
    } 
} 
+0

嗨我試圖從def onLoad = {}關閉訪問它。 – DonX 2010-03-17 07:54:41

+3

看起來依賴注入發生在onLoad事件之後,因此您需要將其從應用程序上下文中提取出來。添加此導入:「導入org.codehaus.groovy.grails.commons.ApplicationHolder爲AH」,然後在您的onLoad中,您可以引用服務爲「def testService = AH.application.mainContext.testService」 – 2010-03-17 16:55:37

10

答案很簡單。是的,你可以使用域內類的服務。

下面是一個示例代碼,其中域類可以從acegi插件訪問authenticate服務。它工作沒有問題。

class Deal { 
    def authenticateService 

    def afterInsert() { 
     def user = authenticateService.userDomain(); 
     .... 
    } 
.... 
} 
+0

這實際上是更好的答案!我把整件事情倒退了。我不應該嘗試從服務中訪問數據庫,我應該將服務注入到Domain類中,並像grails那樣使用grails「triggers」來運行代碼,就像你指出的那樣。 – 2010-03-27 17:31:11

1

總結伯特和房產管理信息系統的答案: 在域自定義驗證,你必須使用obj.testService,而不是直接使用testService。如果您在域自定義驗證想要使用的服務:

static constraints = { 
    name validator: { value, obj -> 
     if (obj.testService.someMethod(value)) { 
     ... 
     } 
    } 
} 

但在其他方法,包括afterInsert和其他私有/公有方法,使用testService是罰款。

def someMethod() { 
    def user = testService.serviceMethod(); 
    .... 
}