在领域类中使用Grails服务

17

我想在我的Grails应用程序中使用一个服务。但是,它总是为null。 我正在使用Grails版本1.1。我该如何解决这个问题?

示例代码:

 class A{
      String name;
      def testService;
      static transients=['testService']
 }

我能在一个领域类中使用一个服务吗?

3个回答

28

那应该可以。请注意,由于您使用的是“def”,因此无需将其添加到短暂列表中。您是否尝试从静态方法访问它?它是实例字段,因此只能从实例访问它。

将服务注入域类的典型用例是进行验证。自定义验证器会传递正在验证的域类实例,因此您可以从那里访问该服务:

static constraints = {
   name validator: { value, obj ->
      if (obj.testService.someMethod(value)) {
         ...
      }
   }
}

嗨,我正在尝试从def onLoad ={}闭包中访问它。 - DonX
3
看起来依赖注入是在onLoad事件之后发生的,因此您需要从应用程序上下文中提取它。添加此导入:"import org.codehaus.groovy.grails.commons.ApplicationHolder as AH",然后在onLoad中,您可以将服务引用为"def testService = AH.application.mainContext.testService"。 - Burt Beckwith

11

简短回答是:是的,您可以在领域类中使用服务。

以下是一个示例代码,其中领域类从acegi插件获取对认证服务的访问权限。它可以正常运行而不会出现问题。

class Deal {
    def authenticateService

    def afterInsert() {
        def user = authenticateService.userDomain();
        ....
    }
....
}

这实际上是更好的答案!我完全搞反了。我不应该尝试从服务访问数据库,而是应该将服务注入到域类中,并使用Grails“触发器”(如afterInsert)运行代码,正如你所指出的那样。 - user122299

1
总结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 - Jerry U

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接