Grails では、プロジェクトの Config.groovy ファイルでグローバル制約を次のように定義できます。
grails.gorm.default.constraints = {
myShared(nullable: false, blank: false)
}
ドメイン内でこのように使用します
static constraints = {
name(shared: "myShared")
}
ドメイン クラスはいくつかの Grails プロジェクトで再利用されるため、プラグインに分割されます。プラグインの Config.groovy ファイルは除外されるため、そこでグローバル制約を定義しても機能しません。したがって、ドメイン クラスを含むプラグインのプラグイン記述子内のアプリケーションの構成にマージされる Constraints.groovy ファイルを作成しました。これは機能しますが、メイン プロジェクト (grails run-app) を実行すると、次の例外が発生します。
Caused by GrailsConfigurationException: Property [test.plugin.TestDomain.name] references shared constraint [myShared:null], which doesn't exist!
Grails コアでデバッグを行った後、プラグイン記述子が実行される前に、ドメイン クラスが共有制約で既に初期化されていることがわかりました。
public DefaultGrailsDomainClass(Class<?> clazz, Map<String, Object> defaultConstraints)
コンストラクター内のマップには、共有制約が含まれています。メイン プロジェクトの Config.groovy ファイルにグローバル制約を配置すると、定義された制約が含まれ、すべて正常に動作します。しかし、プラグイン記述子内でそれらをマージすると、このマップは空になり、例外がスローされます。
私の質問は、Grails プラグイン内で何らかの方法でグローバル制約を定義できるかどうかです。私はおそらく何かを逃していますか?グローバル制約をすべての Grails プロジェクトにコピーすることは解決策ではありません。また、制約を定義するために別のプラグインを使用しないソリューションが推奨されます。
ところで、Grails 2.2.4 を使用しています。