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(...)等,没有错误
我做错了什么?
答案 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()