我想在我的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