Grails でドメイン オブジェクトの制約を検証する通常の方法は、ドメイン オブジェクトで静的な制約クロージャを定義することです。その後、myObject.validate() を呼び出すことができます。
何らかの方法で、検証する必要があるものを検証呼び出しに渡し、制約ブロックを定義しないことは可能ですか?
Spring バリデーターのインスタンスでそれを行うことができると思いますが、Grails からの「良いもの」 (max、email など) をまだ持っている簡単な方法はありますか?
Grails でドメイン オブジェクトの制約を検証する通常の方法は、ドメイン オブジェクトで静的な制約クロージャを定義することです。その後、myObject.validate() を呼び出すことができます。
何らかの方法で、検証する必要があるものを検証呼び出しに渡し、制約ブロックを定義しないことは可能ですか?
Spring バリデーターのインスタンスでそれを行うことができると思いますが、Grails からの「良いもの」 (max、email など) をまだ持っている簡単な方法はありますか?
フィールドのリストを渡すと、.validate(["fieldA", "fieldB"])
それらのフィールドのみが検証されます。これらのフィールドの制約を定義するには、まだ制約ブロックが必要です。
Grails ユーザー ガイドから: " validate メソッドは、検証するプロパティの名前を含むオプションの List 引数を受け入れます。名前のリストが指定されている場合、それらのプロパティのみが検証されます。 "
@eugene82 に返信するには:
@Validateable
class MyDomainValidator {
String email
static constraints = {
email(email:true)
}
}
MyDomain m = new MyDomain()...
MyDomainValidator mv = new MyDomainValidator()..
mv.properties = m.properties
mv.validate()
私はそのようなアプローチを想像します:@Validateable
必要な Grails グッズを内部に持つ静的な制約を持つ groovy クラスを作成します。ドメインのようにすべてのフィールドを所有させ (ドメインを拡張するなど)、ドメイン インスタンスからそのオブジェクトの新しいインスタンスにすべてのフィールドをコピーする方法を提供します (コンストラクターなどを使用)。validate()
そのクラスを呼び出すよりも。
class MyDomain {
String email
MyDomain() {}
MyDomain(email) {
email = this.email
}
}
@Validateable
class MyDomainCustomValidator extends MyDomain {
MyDomainValidator() {}
MyDomainValidator(domain) {
super(domain.email)
}
static constraints = {
email email: true
}
}
def d = new MyDomain('e@mail.com')
new MyDomainCustomValidator(d).validate()