Я не могу получить статический метод Domain.count () для работы - PullRequest
2 голосов
/ 04 августа 2009

Документация Grails определяет статический метод count, определенный в документации следующим образом:

Description

    Counts the number of instances in the database and returns the result

Parameters

    None

Example

    def noOfBooks = Book.count()

Однако всякий раз, когда я звоню, я получаю эту ошибку! Я просто добавил вызов к имени моего класса домена (компании), например, к работающему контроллеру

 def companies = Company.count()

и когда он выделяет эту строку, он взрывается со следующей ошибкой

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pluginManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.RuntimeException: Unable to locate constructor with Class parameter for class org.codehaus.groovy.grails.commons.DefaultGrailsControllerClass

Другой рабочий код в контроллере (предварительно сгенерированный с помощью статических команд скаффолдинга) обращается к Company.get (...) и т. Д. Без ошибок

Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 06 августа 2009

Это

class HomeController {
    def companies = Company.count()

    def index = {
        render(view:"index")
    }
}

Сбой, потому что, как указал лаэль, метод count () недоступен при запуске приложения. Метод count () - это динамический метод, который GORM добавляет к классам домена. Spring (базовая структура) создает объект для каждого артефакта (Controller / Service / Domain Class и т. Д.) При запуске. ГОРМ будет после этого.

Spring пытается создать класс HomeController. Конструкция Home Controller назначит значение company.count для Companies при запуске, однако GORM еще не запущен, поэтому динамические методы не были добавлены.

В любом случае, этот код неверен, если он сработал, тогда переменная companies будет иметь значение только числа компаний при запуске приложения. Как только вы привыкнете к Groovy и Grails, я думаю, вы оцените скорость разработки.

Надеюсь, это поможет.

1 голос
/ 05 августа 2009

Краткий ответ: метод count() и многие другие добавляются в метакласс во время выполнения после загрузки подключаемого модуля Hibernate. count() не статический метод, который доступен во время компиляции, как это делает Java, а скорее статический метод, который добавляется к метаклассу домена во время выполнения (очевидно, после анализа контроллеров).

Почему? Потому что нет смысла иметь методы count(), get() или read() и т. Д., Пока не будет инициализирован Hibernate / GORM. Он не будет подключен к источнику данных, и методы будут недействительными.

Я не могу не задаться вопросом, почему вам нужно поместить такое свойство в контроллер. Как только вы сохраните новую компанию или удалите ее, количество ваших компаний будет отключено.

Длинным ответом будет погружение в источник Грааля, из GORMNamespaceHandler -> GORMSessionFactoryDefinitionParser -> GORMEnhancingBeanPostProcessor -> HibernatePluginSupport -> HibernatePluginSupport.addBasicPersistenceMethods()

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