2009年10月28日水曜日

Custom Constraintsを使ってみた

制約を自由に追加できるプラグインがリリースされたので早速使ってみた。

grails install-plugin constraints

とりあえずalpha(英字のみ許す)制約で作成する。

grails create-constraint alpha

するとgrails-app/utils/AlphaConstraint.groovyが生成される。同時にテストケースも作成される。あとはvalidatorを書く感じにvalidateクロージャを実装する。

class AlphaConstraint {

def defaultMessageCode = 'default.not.alpha.message'

def supports = { type ->
return type!= null && String.class.isAssignableFrom(type)
}

def validate = { propertyValue ->
propertyValue ==~ /[A-Za-z]+/
}
}

defaultMessageCodeを定義すると、定義したキーでメッセージが使える。
supportsはどの型用の制約かを定義する。

メッセージ定義に以下を追加する。埋め込みオブジェクトは、プロパティ名、クラス名、プロパティ値、制約のパラメタ。

default.not.alpha.message=Property [{0}] of class [{1}] with value [{2}] must be alphabet

これでドメインクラスに制約として使える。今までvalidatorに実装してたのも使い回しができるようになって最高です。validatorと違うところはメッセージキーを返せないところ。validateクロージャの実行結果がBoolean(boolean)にならないとClassCastExceptionが発生した。
使い方はこんな感じ。

class Book {

def title

static constraints = {
title(blank: false, alpha: true)
}
}

つづいて他のプロパティを参照する系を試してみる。
例としてleProperty(他のプロパティ以下であること)制約を作る
他のプロパティを参照する場合は、やっぱりvalidatorの実装と同様に2つ目のパラメタを用意してあげればいい。

class LePropertyConstraint {

def defaultMessageCode = 'default.not.leProperty.message'

def validate = { propertyValue, target ->
target."$params" ? propertyValue <= target."$params" : true
}

}

paramsは制約のパラメタ。
使うときは以下のような感じ。

class Project {
Date dateStarted
Date dateEnded
static constraints = {
dateStarted(leProperty: 'dateEnded')
dateEnded()
}
}

制約を修正するとリロードするけど、その制約を評価したときに例外が発生する。そこは今後に期待です。

0 件のコメント: