2016-03-21 4 views
0

私はgrailsアプリケーションを使って作業しています。 get()save()delete()findBy()などのメソッドを実行し、grailsアプリケーションのドメインに関連したいと思います。 Domain.get()メソッドを実行するとUtilsまたはsrc/groovyパッケージ以下のエラーが出ます。Utilsまたはsrc/groovyでドメインクラスメソッドを使用するには?

Caught: java.lang.IllegalStateException: Method on class [Domain Class] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly. 

java.lang.IllegalStateException: Method on class [Domain Class] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly. 

いずれも、どのように私はUtilsのまたはのsrc /グルーヴィークラス内のドメインクラスのメソッドを使用することができます私を助けて?

+0

あなたはあなたの質問にもっと文脈を提供する必要があります。 'src/groovy'のどこでクラスを使用していますか?何が彼らを呼び、そしてあなたのドメインクラスを呼びますか?あなたがやっていることの実際の例で、あなたの質問にもっと詳しく説明してください。あなたはより良い答えを得るでしょう。 –

+0

インポートcom.chatportal.ShiroUser クラスChatUtility { \t静的主(引数){ \t \tデフchatUtility =新しいChatUtility() \t \t chatUtility?.display(1) \t} \t \t DEFディスプレイ( DEF ID){ \t \tのprintln "ChatUtilityチャットユーザ:" + ShiroUser.get(ID) \t}} –

+0

は、試験中またはTで起こっ誤差であります彼はアプリを実行している? –

答えて

-1

src/groovyまたはutilsの中にドメインクラスを使用しないでください。あなたはそれにサービスを利用すべきです。 best practises for Grails architectureをチェックアウト:独自のドメインにモデルドメイン固有のロジックを置く

ドメイン

  • 賛成。依存性の少ない単一のドメインに適用されるものはすべて、そのドメインクラスに入れなければなりません。しかし、そのドメイン固有のロジックに限定してください。ドメインのグループを扱うより複雑なビジネスロジックは、サービスに属します。
  • 一般的な部分クエリを再利用したり、複雑なロジックを分解したりするには、名前付きクエリを使用し、必要に応じてそれらを連鎖させます。
  • 他の一般的なユーティリティクラスや値オブジェクトをドメインフォルダに混在させないでください。src/groovyに入れることができます。これらのクラスがバリデーションをサポートする必要がある場合は、それらを@Validateableで注釈を付けることができます。

あなたはまだそれをしたい場合は、this FAQを確認してください。

import org.codehaus.groovy.grails.commons.ApplicationHolder 
//… 
def book = ApplicationHolder.application.getClassForName("library.Book").findByTitle("Groovy in Action") 
+0

私はすでにPROJECT/grails-app/domain/ –

+2

の中にドメインクラスを作成しています。@Michal_Szulc "ドメインクラスをsrc/groovyまたはutils内で使用しないでください。 - 'src/groovy'で定義されているコードからドメインクラスを参照することは、完全に合理的なことです。 –

+0

IMHOすべてのドメイン駆動ロジックを 'domain'に置き、' service'メソッドを異なる 'domain'メソッドと' src/groovy'ヘルパーメソッドの間の接着剤として使用する方がクリーンです。 'controllers'はフローハンドラであり、もちろん追加のヘルプクラスは' src/groovy'に残ります。なぜあなたはそれを混ぜたいですか? –

0

このエラーは、適切にGORMに登録されていないGORMエンティティとの相互作用によって引き起こされます。このエラーは、対話が開始された場所(「src/groovy」、「grails-app/services/」など)とは関係ありません。

必ずしもそうではありませんが、ほとんどの場合、エンティティタイプがGORMに登録されていないテスト環境でこのエラーが発生します。

https://github.com/jeffbrown/illegalaccessgormのプロジェクトを参照してください。そのプロジェクトには次のものが含まれています。

ドメインクラス:

// grails-app/domain/demo/Person.groovy 
package demo 

class Person { 
    String name 
} 

サービス:

// grails-app/services/demo/HelperService.groovy 
package demo 

class HelperService { 

    int getNumberOfPeople() { 
     Person.count() 
    } 
} 

ユーティリティクラス:

// src/groovy/demo/SomeHelper.groovy 
package demo 

class SomeHelper { 
    int getNumberOfPeople() { 
     Person.count() 
    } 
} 

サービスのためのユニット・テスト:

// test/unit/demo/HelperServiceSpec.grovy 
package demo 

import grails.test.mixin.TestFor 
import spock.lang.Specification 

@TestFor(HelperService) 
@Mock(Person) 
class HelperServiceSpec extends Specification { 


    void "test gorm method"() { 
     expect: 
     service.numberOfPeople == 0 
    } 
} 
ユーティリティクラスの

ユニット試験:これらの試験の

// test/unit/demo/SomeHelperSpec.groovy 
package demo 

import spock.lang.Specification 

@Mock(Person) 
class SomeHelperSpec extends Specification { 

    void "test gorm method"() { 
     given: 
     def helper = new SomeHelper() 

     expect: 
     helper.numberOfPeople == 0 
    } 
} 

両方が通過します。あなたがそれらのいずれかから@Mock(Person)を削除した場合、テストは次のように失敗します。

java.lang.IllegalStateException: Method on class [demo.Person] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly. 

問題がテスト以外のいくつかの状況で何が起こっている場合は、コンテキストについての詳細を知ることが役立つだろう。その他の疑わしい疑いがあるのは、何らかの理由で正しく初期化されていないJavaエンティティであり、場合によってはプラグインから取り込まれたドメインクラスに問題がある可能性があります。

また、あなたが使用しているGrailsのバージョンが適切であるかもしれません。

私はすべてが意味を成就することを願っています。

関連する問題