7

通常、Grails ドメインまたはコマンド クラスでは、制約を宣言すると、フレームワークは、validate()これらの各制約が現在のインスタンスに対して有効かどうかをチェックするメソッドを追加します。

class Adult {

  String name
  Integer age

  void preValidate() { 
    // Implementation omitted
  }

  static constraints = {
    name(blank: false)
    age(min: 18)
  }
}

def p = new Person(name: 'bob', age: 21)
p.validate()

preValidate私の場合、クラスが検証される前に常に実行されるようにしたいと考えています。メソッドを追加することでこれを達成できました

def customValidate() {
  preValidate()
  validate()
}

customValidateしかし、このクラスを使用するすべての人は、の代わりにを呼び出すことを覚えておく必要がありvalidateます。これもできない

def validate() {
  preValidate()
  super.validate()
}

validate親クラスのメソッドではないためです(メタプログラミングによって追加されます)。私の目標を達成する別の方法はありますか?

4

2 に答える 2

2

beforeValidate() イベントを使用して目的を達成できる場合があります。これは1.3.6 リリース ノートに記載されています。

于 2011-05-25T14:08:34.393 に答える
2

ドメイン/コマンド クラスに preValidate() メソッドがある場合、メタクラスで独自のバージョンの検証を使用することで、これを達成できるはずです。あなたの以下のコードに似たものがあなたのBootStrap.groovyために働くことができます:

class BootStrap {

    def grailsApplication   // Set via dependency injection

    def init = { servletContext ->

        for (artefactClass in grailsApplication.allArtefacts) {
            def origValidate = artefactClass.metaClass.getMetaMethod('validate', [] as Class[])
            if (!origValidate) {
                continue
            }

            def preValidateMethod = artefactClass.metaClass.getMetaMethod('preValidate', [] as Class[])
            if (!preValidateMethod) {
                continue
            }

            artefactClass.metaClass.validate = {
                preValidateMethod.invoke(delegate)
                origValidate.invoke(delegate)
            }
        }
    }

    def destroy = {
    }
}
于 2011-04-10T22:03:39.520 に答える