2

プロパティの汎用カスタムバリデーターを作成しようとしています。汎用にするために、クロージャー内のフィールド名への参照が必要です。コードは次のとおりです。

grails.gorm.default.constraints = {
nameShared(validator: {val, obj, errors->
        Pattern p = Pattern.compile("[a-zA-Z0-9-]{1,15}")
        Matcher m = p.matcher(val)
        boolean b = m.matches()
        if(!b)
        errors.rejectValue('name', "${obj.class}.name.invalid", "Name is invalid")

    })

私のドメインクラスで

class Student{
  String name

  static constraints = {
       name(shared:'nameShared')
   }
}

class Teacher{
  String firstName
  String lastName

  static constraints = {
     firstName(shared:'nameShared')
  }
}

name と firstName の両方に同じバリデーターを使用したいのですが、バリデーターで fieldName をハードコーディングしているため、firstName ではなく name に対して常に機能するため、とにかく参照を取得できるかどうかを知りたいですfieldname を作成し、バリデータをジェネリックにします。助けてください

4

2 に答える 2

6

この変数propertyNameを使用して、検証済みのプロパティの名前を取得できます。

grailsドキュメントから:

Closure は、制約が適用されるフィールドの名前にもアクセスできます。propertyName

myField validator: { val, obj -> return propertyName == "myField" }
于 2013-01-02T11:35:15.790 に答える
0

次のような別の関数内にバリデータークロージャーをラップすることができます。

def getValidator(myValue) {
  return { val, obj, errors ->
    // make use of myValue
  }
}

myField validator: getValidator('foo')
于 2013-01-02T11:38:53.573 に答える