2016-03-25 15 views
4

私はそうのように定義された形質を持っている:@Enhances Grailsのコントローラ

@Enhances(ControllerArtefactHandler.TYPE) 
trait NullCheckTrait { 
    def nullCheck(def object) { 
     // code here 
    } 
} 

私は私のコントローラからnullCheck(foo)を呼び出すと、私はNo signature of method例外を取得します。コントローラーの私がimplements NullCheckTraitなら、正常に動作します。私は@Enhancesがgrailsプラグインを作成してその特性をそこに置いた場合にのみ動作することを読んだ。これが既知の問題で、コントローラと同じgrailsアプリケーションから@Enhancesを動作させる方法があるのであれば私は興味があります。

答えて

3

いいえ@Enhancesクラスはコンパイルする前にクラスパス上にある必要があるため、これを回避する方法はありません。たとえば、コントローラクラスが最初にコンパイルされ、その後に特性が適用されないと、特性が適用されず、コンパイル順序を制御する方法がないため、これは問題のままです。これは、同じプロジェクトで行うことができ

唯一の他の方法は、セットアップするのGradleで設定した追加の源である、次を参照してください。

How do I add a new sourceset to Gradle?

+0

Thanks Graemeそれは全く意味をなさない。そして、リンクのおかげで。 – Gregg

+0

@Graeme Rocherはまだ有効ですか?既にソースがあり、src/astの下にある変換を同じプロジェクトであっても、ASTだけのプラグインを追加する必要はありません。 –

1

カスタムを作成するためにあなたを必要としないもう一つの解決策があります追加のソースセット。

grails gradle pluginのデフォルトでは、astという名前のソースセットがあり、メインソースセットの前にコンパイルされます。そのため、あなたは、あなたの特性をastソースセットに入れることができ、それは同じプラグイン/プロジェクトであってもアーチファクトに適用されます。

はここにあなたのプロジェクトの構造が

​​

どうあるべきかだとこれはあなたのsourceSetを選んで、それを適用するのsrc /メインのsourceSetとGrailsのクラスの前にコンパイルされます。

更新: Grailsは、アプリケーションではなく、プラグインプロジェクトのみのastソースセットを設定します。ここでは、アプリケーション用にAST sourcesetを作成する方法に関するブログエントリを書きました

+0

以下の私の答えをご覧ください:上記の解決策は、プラグインプロジェクトのみであり、アプリケーションプロジェクトではありません。 https://github.com/grails/grails-core/issues/10717を発行してください –

関連する問題