【问题标题】:Using grails service in domain class在域类中使用 grails 服务
【发布时间】:2011-01-28 10:18:03
【问题描述】:

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

示例代码:

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

我可以在域类中使用服务吗?

【问题讨论】:

    标签: grails


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多