アレについて記す

GrailsのValidationで自作Constraintsを使う(Github経由)

Posted on February 28, 2014 at 23:12 (JST)

以下の3ステップで自作した制約(Constraint)をGrailsのバリデーションで使用できるようになります。

  1. プラグイン・プロジェクトで制約を定義したクラスを作成する
  2. GithubにMavenレポジトリを作成し、作成したプラグインを配信可能にする
  3. Grailsアプリで作成したプラグインの読み込み設定をする

今回はサンプルとして、日付文字列の正当性チェックを行う制約を作成しました。
サンプルはGithubにて公開しています。[ my-validation-plugin ]

1. プラグイン・プロジェクトで制約を定義したクラスを作成する

Grailsはアプリケーション起動時に制約クラスを読み込みます。
プラグイン・プロジェクトにはアプリケーション起動時に、任意の処理を読み込ませる仕組みが用意されています。

コード配置

左図で選択している(背景色が青の)部分が今回のメインとなるソースです。

message.properties
エラー時のデフォルト・メッセージを定義します。
呼び出し側のアプリに該当するメッセージが存在しない場合、デフォルト・メッセージが表示されます。
DateConstraint.groovy
自作制約クラスです。org.codehaus.groovy.grails.validation.AbstractConstraintを継承させます。 実装についてはGrails標準の制約クラスが参考になります。
[ Githubでgrails-coreのソースを見る ]
DateConstraintSpec.groovy
自作のテストクラスです。パラメタライズドテストを行っています。
DateConstraintTests.groovy
こちらではgrails-coreのテストクラスに準拠したテストを行っています。
AbstractConstraintTestsとTestClassはgrails-coreから拝借しました。
MyValidationPluginGrailsPlugin.groovy
grails create-pluginコマンドにて自動で作成されます。
特定のタイミングで任意の処理を読み込ませる設定を記載できます。

下記の設定にて、自作制約クラスを読み込ませることが可能です。

[ ${プラグイン名}GrailsPlugin.groovy ]

def loadAfter = ['controllers']
def doWithSpring = {
    ConstrainedProperty.registerNewConstraint(
            DateConstraint.DATE_CONSTRAINT, DateConstraint.class);
}

その他のクラスについては特筆すべきこともないので、省略します。

制約クラスの作成は下記の記事も参考にしています。

しおしおの雑記帳
Grailsでカスタムバリデーションを作ってみた

2. GithubにMavenレポジトリを作成し、作成したプラグインを配信可能にする

Githubに配信用リポジトリを用意した後、ローカルにアップロード用のリポジトリを作成します。

GithubのMavenリポジトリ化、およびデプロイについては下記の記事を参考にしました。

bluepapa32’s Java Blog
GitHub を Maven 公開リポジトリにする (Gradle 編)

Literal Ice
GrailsのプラグインリポジトリとしてGithubを使う

なお、私はMacにて以下の設定をしています。

[ settings.groovy ]

ls.release.scm.enabled = false  <br/>
grails.project.repos.default = "localRelease"
grails.project.repos.localRelease.url = "file:///Users/username/repos/mvn/"

3. Grailsアプリで作成したプラグインの読み込み設定をする

以下の設定を追加すればOKです。

[ BuildConfig.groovy ]

repositories {
    mavenRepo "http://onbass-naga.github.io/mvn/"
}
plugins {
    compile "com.example:my-validation-plugin:0.1"
}

使い方

// DomainクラスやCommandクラス
static constraints = {
    deadline date:true
}

以上です。