2009-08-04 5 views
2

Grailsのドキュメントは、次のようにドキュメントで定義された「カウント」の静的メソッドを定義して仕事を得るカントエラー!私は、単純な作業コントローラー私はDomain.count()静的メソッドは、

def companies = Company.count() 

にこのように私のドメイン・クラス(会社)の名前への呼び出しを追加し、それがその行をexectutesとき、それは

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(...)などにアクセス

何が間違っていますか?

答えて

1

短い答えは、count()メソッドなどが、Hibernate Pluginがロードされた後、実行時にmetaClassに追加されるというものです。 count()は、Javaのようにコンパイル時に利用できる静的メソッドではなく、実行時にドメインのメタクラスに追加される静的メソッドです(明らかにコントローラの解析後)。

なぜですか?これは、Hibernate/GORMが初期化されるまで、count(),get()またはread()などの方法を持つことは意味がないためです。それはデータソースに接続されず、メソッドは無効になります。

なぜコントローラのようなプロパティを配置する必要があるのだろうと思うのですか?あなたが新しい会社を救ったり、会社を削除したりすると、あなたの会社の数は減ります。

長い答えは、Grailsのソースに飛び込むだろうGORMNamespaceHandlerから - >GORMSessionFactoryDefinitionParser - >GORMEnhancingBeanPostProcessor - >HibernatePluginSupport - この

class HomeController { 
    def companies = Company.count() 

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

が失敗>HibernatePluginSupport.addBasicPersistenceMethods()

+0

ありがとうございます!私はGroovy/Grailsを使い始めています。以前のJavaの経験はありません(私は哲学的な理由からそれを避けました)が、SchemeからErlangまでの他のすべての動的言語を使用した大規模なシステムを作成しました。 Groovy/Grailsには非常に混乱している舞台裏の魔法がたくさんあります。(実際の動的言語であればいいし、Python/Djangoのように私の環境の中でシェルを開くこともできます。) –

+2

'Count ) 'ブートストラップで..?私は本当に人々がコードの一部を使う必要があると想像できない答えに疲れています。ちょっとしたコードを使う必要がある非常に多くの状況があり、答えるときなぜそれが必要なのかわからないかもしれません。質問に答えてください! –

+0

Company.count()はBootStrap.groovyのinitクロージャで動作します。ユーザーがアプリケーションの開始時に企業の数を望む場合、GORMが初期化され、データソースが接続された後にこれを実行する必要があります。その動作をどこで望むかも想像できますが、コントローラ上のプロパティとコントローラアクションの違いを理解する。 –

3

ためラエルは、カウントを指摘したように()メソッドは、アプリケーションの起動時には使用できません。 count()メソッドは、GORMがドメインクラスに追加した動的メソッドです。 Spring(基本フレームワーク)は、起動時にすべての成果物(コントローラ/サービス/ドメインクラスなど)のオブジェクトを作成します。 GORMはこの後になります。

春はHomeControllerクラスを作成しようとしていますが、Home Controllerの構築によって起動時にcompany.countの値がCompanyに割り当てられますが、GORMはまだ開始されていないため動的メソッドは追加されません。

このコードは間違いですが、それがうまくいけば、企業の変数はアプリケーションの起動時の企業数の価値しか持たないでしょう。 GroovyとGrailsに "使用"されると、開発のスピードがわかると思います。

これが役に立ちます。

関連する問題