在域类中使用 grails 服务
Posted
技术标签:
【中文标题】在域类中使用 grails 服务【英文标题】:Using grails service in domain class 【发布时间】:2011-01-28 10:18:03 【问题描述】:我想在我的 Grails 应用程序中使用服务。但是,它始终为空。我正在使用 Grails 1.1 版。我该如何解决这个问题?
示例代码:
class A
String name;
def testService;
static transients=['testService']
我可以在域类中使用服务吗?
【问题讨论】:
【参考方案1】:应该可以。请注意,由于您使用的是“def”,因此无需将其添加到瞬变列表中。您是否尝试从静态方法访问它?它是一个实例字段,因此您只能从实例中访问它。
将服务注入域类的典型用例是用于验证。自定义验证器会通过正在验证的域类实例,因此您可以从中访问服务:
static constraints =
name validator: value, obj ->
if (obj.testService.someMethod(value))
...
【讨论】:
您好,我正在尝试从 def onLoad = 闭包中访问它。 看起来依赖注入发生在 onLoad 事件之后,因此您需要从应用程序上下文中提取它。添加此导入:“import org.codehaus.groovy.grails.commons.ApplicationHolder as AH”,然后在您的 onLoad 中,您可以将服务引用为“def testService = AH.application.mainContext.testService”【参考方案2】:简短的回答是。是的,您可以在域类中使用服务。
这是一个示例代码,其中域类可以从 acegi 插件访问身份验证服务。它可以正常工作。
class Deal
def authenticateService
def afterInsert()
def user = authenticateService.userDomain();
....
....
【讨论】:
这实际上是更好的答案!我把整个事情倒过来了。正如您所指出的,我不应该尝试从服务访问数据库,我应该将服务注入 Domain 类并使用像 afterInsert 这样的 grails“触发器”运行代码。【参考方案3】:总结 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
以上是关于在域类中使用 grails 服务的主要内容,如果未能解决你的问题,请参考以下文章