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

Grails 我无法使Domain.count()静态方法工作,grails,dns,Grails,Dns,Grails文档定义了一个“count”静态方法,在文档中定义如下: Description Counts the number of instances in the database and returns the result Parameters None Example def noOfBooks = Book.count() 当它执行该行时,会出现以下错误 org.springframework.beans.factory.BeanCreationE

Grails文档定义了一个“count”静态方法,在文档中定义如下:

Description Counts the number of instances in the database and returns the result Parameters None Example def noOfBooks = Book.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(…)等,没有错误


我做错了什么?

简单的回答是加载Hibernate插件后,在运行时将
count()
方法和许多其他方法添加到元类中
count()
不像Java那样是在编译时可用的静态方法,而是在运行时(显然是在解析控制器之后)添加到域元类中的静态方法

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

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

长期的答案是深入Grails的源代码,从
GORMNamespaceHandler
->
GORMSessionFactoryDefinitionParser
->
GORMEnhancingBeanPostProcessor
->
HibernatePluginSupport
->
HibernatePluginSupport.addBasicPersistenceMethods()

class HomeController {
    def companies = Company.count()

    def index = {
        render(view:"index")
    }
}
失败,因为正如lael指出的,启动应用程序时count()方法不可用。count()方法是GORM添加到域类的动态方法。Spring(底层框架)在启动时为每个工件(控制器/服务/域类等)创建一个对象。戈姆会在这之后

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

无论如何,此代码都是不正确的,如果它确实起作用,那么companys变量将只具有应用程序启动时的companys number的值。一旦您“习惯”了groovy和grails,我想您会欣赏开发的速度


希望这有帮助。

谢谢你的回答!我刚刚开始使用Groovy/Grails。我以前没有Java方面的经验(出于哲学上的原因,我避免了使用Java),但除了很多老派的C/C++经验外,我还使用Scheme到Erlang等所有其他动态语言编写了大型系统。Groovy/Grails中有很多幕后魔法,让事情变得非常混乱。(如果它是一种真正的动态语言,我可以在我的环境中打开一个shell,就像Python/Django让我做的那样,并尝试一下……)如果您想在引导中添加
Count()
,该怎么办。。?我真的厌倦了那些人们无法想象你需要在哪里使用一段代码的答案——问题是在很多情况下,你可能需要使用一段代码,而在回答的时候,你可能不知道为什么需要它。请坚持回答这个问题!count()将在BootStrap.groovy的init闭包中工作。如果用户希望在应用程序开始时计算公司数,则需要在GORM初始化、数据源连接等之后进行。我可以想象您可能希望这种行为发生在何处——但用户显示他们不理解控制器上的属性和控制器操作之间的区别。
class HomeController {
    def companies = Company.count()

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