我无法使Domain.count()静态方法工作

时间:2009-08-04 16:53:43

标签: grails dns

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 个答案:

答案 0 :(得分:3)

这个

class HomeController {
    def companies = Company.count()

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

失败,因为当lael指出应用程序启动时count()方法不可用。 count()方法是GORM添加到域类的Dynamic方法。 Spring(底层框架)在启动时为每个工件(Controller / Service / Domain Class等)创建一个对象。 GORM将在此之后。

Spring正在尝试创建一个HomeController类,Home Controller的构造将在启动时将company.count的值分配给公司,但是GORM尚未启动,因此尚未添加动态方法。

此代码无论如何都是不正确的,如果它确实有效,那么公司变量只会具有启动应用程序时公司数量的值。一旦你“习惯”了常规和grails,我想你会欣赏发展的速度。

希望这有帮助。

答案 1 :(得分:1)

简短的回答是,在加载Hibernate插件后,count()方法和许多其他方法在运行时被添加到metaClass。 count()不是一个静态方法,它在编译时可以像Java那样使用,而是一个在运行时添加到Domain的metaClass的静态方法(显然在解析控制器之后)。

为什么呢?因为在初始化Hibernate / GORM之前,使用count()get()read()等方法是没有意义的。它不会被连接到数据源,并且方法将无效。

我不禁想知道为什么你需要在控制器上放置这样的属性。一旦您保存新公司或删除一家公司 - 您的公司数量就会被取消。

长期的答案将潜入Grails的来源,来自GORMNamespaceHandler - > GORMSessionFactoryDefinitionParser - > GORMEnhancingBeanPostProcessor - > HibernatePluginSupport - > HibernatePluginSupport.addBasicPersistenceMethods()