在域类中使用 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 服务的主要内容,如果未能解决你的问题,请参考以下文章

grails - 找不到域类

grails域类中的时间字段

在 Grails 中仅输出日期 + 时间的日期部分

在另一个域类中查看 grails 域类属性

如何在域类中将 Taglib 作为函数调用

更新 Grails 中父域类中的“lastUpdated”字段