Почему статические методы класса Domain не работают изнутри "сервиса" grails? - PullRequest
1 голос
/ 26 марта 2010

Я хочу, чтобы служба grails имела доступ к статическим методам домена, для запросов и т. Д.

Например, в контроллере я могу позвонить

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") возвратил ноль. Это слишком рано, чтобы называть это? Можно ли назвать «поздний инициал»? Я думал, что это было целью "afterPropertiesSet ()" ...

Ответы [ 2 ]

5 голосов
/ 26 марта 2010

Метаклассы подключаются после настройки контекста приложения 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()
   }
}
0 голосов
/ 27 марта 2010

Реальный ответ, как я обнаружил, не в том, чтобы делать это.

Вместо этого я должен внедрить свой сервис в мой класс домена и вызвать его оттуда.

Я могу использовать методы «триггера», такие как afterInsert, чтобы вызывать мои сервисные методы при необходимости

class Deal {
    def authenticateService

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

(например, из документации по сервису Grails)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...