为什么Domain类静态方法不能在grails“服务”中工作?

时间:2010-03-25 21:01:12

标签: hibernate grails groovy dns

我希望grails服务能够访问Domain静态方法,查询等等。

例如,在控制器中,我可以调用

IncomingCall.count()

获取表“IncomingCall”中的记录数

但如果我尝试从服务中执行此操作,则会收到错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'incomingStatusService': Invocation of init method failed; nested exception is groovy.lang.MissingMethodException: No signature of method: static ms.wdw.tropocontrol.IncomingCall.count() is applicable for argument types: () values: []

这些方法如何注入?在控制器中没有神奇的def语句似乎这样做。或者是我的服务类无法使用Hibernate的问题?

我也是这样试过的:

import ms.wdw.tropocontrol.IncomingCall
import org.codehaus.groovy.grails.commons.ApplicationHolder

// ...

void afterPropertiesSet() {

    def count = ApplicationHolder.application.getClassForName("IncomingCall").count()
    print "Count is " + count
}

它失败了。 ApplicationHolder.application.getClassForName(“IncomingCall”)返回null。现在称这个为时尚早?是否有可以调用的“晚期初始化”?我认为这是“afterPropertiesSet()”...

的目的

2 个答案:

答案 0 :(得分:5)

在配置Spring应用程序上下文之后连接元类方法,因此尝试在afterPropertiesSet中调用它们将失败。相反,您可以创建一个常规的init()方法并从BootStrap中调用它:

import ms.wdw.tropocontrol.IncomingCall

class FooService {

   void init() {
      int count = IncomingCall.count()
      println "Count is " + count
   }
}

用这个称呼:

class BootStrap {

   def fooService

   def init = { servletContext ->
      fooService.init()
   }
}

答案 1 :(得分:0)

我发现真正的答案是不要这样做。

我应该将我的服务注入我的域类并从那里调用它。

我可以使用“trigger”方法,比如afterInsert,可以根据需要调用我的服务方法

class Deal {
    def authenticateService

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

(例如,来自grails服务文档)