2010-03-17 98 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(); 
    .... 
}