【发布时间】:2011-01-28 10:18:03
【问题描述】:
我想在我的 Grails 应用程序中使用服务。但是,它始终为空。我正在使用 Grails 1.1 版。我该如何解决这个问题?
示例代码:
class A{
String name;
def testService;
static transients=['testService']
}
我可以在域类中使用服务吗?
【问题讨论】:
标签: grails
我想在我的 Grails 应用程序中使用服务。但是,它始终为空。我正在使用 Grails 1.1 版。我该如何解决这个问题?
示例代码:
class A{
String name;
def testService;
static transients=['testService']
}
我可以在域类中使用服务吗?
【问题讨论】:
标签: grails
应该可以。请注意,由于您使用的是“def”,因此无需将其添加到瞬变列表中。您是否尝试从静态方法访问它?它是一个实例字段,因此您只能从实例中访问它。
将服务注入域类的典型用例是用于验证。自定义验证器会通过正在验证的域类实例,因此您可以从中访问服务:
static constraints = {
name validator: { value, obj ->
if (obj.testService.someMethod(value)) {
...
}
}
}
【讨论】:
简短的回答是。是的,您可以在域类中使用服务。
这是一个示例代码,其中域类可以从 acegi 插件访问身份验证服务。它可以正常工作。
class Deal {
def authenticateService
def afterInsert() {
def user = authenticateService.userDomain();
....
}
....
}
【讨论】:
总结 Burt 和 Remis 的答案:
在域自定义验证器中,您必须使用obj.testService 而不是直接使用testService。如果您想在域自定义验证器中使用服务:
static constraints = {
name validator: { value, obj ->
if (obj.testService.someMethod(value)) {
...
}
}
}
但在其他方法中,包括afterInsert 和其他私有/公共方法,使用testService 就可以了。
def someMethod() {
def user = testService.serviceMethod();
....
}
【讨论】:
beforeUpdate() 中收到此错误。但是当我从它的服务类中保存它时它工作正常。 Caused by: java.lang.NullPointerException: Cannot invoke method sendReservationUpdate() on null object