我想在我的Grails應用程序中使用服務。但是,它始終爲空。我正在使用Grails版本1.1。我怎麼解決這個問題?在域類中使用grails服務
示例代碼:
class A{
String name;
def testService;
static transients=['testService']
}
我可以使用的服務的領域類裏面?
我想在我的Grails應用程序中使用服務。但是,它始終爲空。我正在使用Grails版本1.1。我怎麼解決這個問題?在域類中使用grails服務
示例代碼:
class A{
String name;
def testService;
static transients=['testService']
}
我可以使用的服務的領域類裏面?
這應該工作。請注意,由於您使用的是'def',因此您無需將其添加到瞬態列表中。你是否試圖從靜態方法訪問它?這是一個實例字段,所以你只能從實例中訪問它。
將服務注入域類的典型用例用於驗證。自定義驗證被傳遞域類的實例所驗證,所以你可以從訪問服務:
static constraints = {
name validator: { value, obj ->
if (obj.testService.someMethod(value)) {
...
}
}
}
答案很簡單。是的,你可以使用域內類的服務。
下面是一個示例代碼,其中域類可以從acegi插件訪問authenticate服務。它工作沒有問題。
class Deal {
def authenticateService
def afterInsert() {
def user = authenticateService.userDomain();
....
}
....
}
這實際上是更好的答案!我把整件事情倒退了。我不應該嘗試從服務中訪問數據庫,我應該將服務注入到Domain類中,並像grails那樣使用grails「triggers」來運行代碼,就像你指出的那樣。 – 2010-03-27 17:31:11
總結伯特和房產管理信息系統的答案: 在域自定義驗證,你必須使用obj.testService
,而不是直接使用testService
。如果您在域自定義驗證想要使用的服務:
static constraints = {
name validator: { value, obj ->
if (obj.testService.someMethod(value)) {
...
}
}
}
但在其他方法,包括afterInsert
和其他私有/公有方法,使用testService
是罰款。
def someMethod() {
def user = testService.serviceMethod();
....
}
嗨我試圖從def onLoad = {}關閉訪問它。 – DonX 2010-03-17 07:54:41
看起來依賴注入發生在onLoad事件之後,因此您需要將其從應用程序上下文中提取出來。添加此導入:「導入org.codehaus.groovy.grails.commons.ApplicationHolder爲AH」,然後在您的onLoad中,您可以引用服務爲「def testService = AH.application.mainContext.testService」 – 2010-03-17 16:55:37