S2Swing

バリデーション - S2Swing リファレンス

バリデーションの実践的な使用手順については、チュートリアルを参照してください。

制約アノテーション一覧

S2Swingで定義済みの制約アノテーションは、以下の通りです。 各アノテーションの詳細はAPIドキュメントを参照してください。

アノテーション名 内容
@Required 入力が必須であることを指定します。
@NotBlank 文字列が非空白であることを指定します。
@Length 文字列の長さの範囲を指定します。
@Pattern 文字列が従うべき正規表現を指定します。
@ByteRange byte型数値の範囲を指定します。
@ShortRange short型数値の範囲を指定します。
@IntRange int型数値の範囲を指定します。
@LongRange long型数値の範囲を指定します。
@FloatRange float型数値の範囲を指定します。
@DoubleRange double型数値の範囲を指定します。

バインディングとの併用

バリデーションは通常、バインディングと併用することになります。 バインディングでは、ターゲットプロパティが変更された時点で制約が検証され、成功すればその値がソースプロパティに代入されます。 バリデーションが失敗した場合、ソースプロパティは変更されません。

バリデーションの結果はBindingStateEvent型のイベントとして、BindingStateListenerリスナーに通知されます。 このリスナーに、エラーメッセージの表示処理などを記述します。

バインディングを使用しない単独バリデーション

ModelValidatorクラスを使用することで、モデルクラスのプロパティに付加した制約を、単独で検証することも可能です。

エラーメッセージのカスタマイズ

デフォルトでは、バリデーションが失敗したときに生成されるエラーメッセージは、以下の形式をとります。

[propertyName] : [errorMessage]

例えば、"age"という名前のプロパティが@Required制約に違反したときのエラーメッセージは、次のようになります。

age : 入力が必須です。

リソースファイルを使って、この[propertyName]側と[errorMessage]側の両方をカスタマイズすることができます。

プロパティ名のカスタマイズ

エラーメッセージ中のプロパティ名をカスタマイズするには、制約アノテーションを持つモデルクラスに対応するリソースファイルに、以下の形式で記述を行います。

[propertyName].label = [customLabel]

例えば、example.Modelクラスのageプロパティの表示名を「年齢」としたい場合には、example/resources/Model.propertiesファイルに

age.label = 年齢

と記述します。

メッセージ本体のカスタマイズ

エラーメッセージの本体部分をカスタマイズするには、制約アノテーションを持つモデルクラスに対応するリソースファイルに、以下の形式で記述を行います。

[propertyName].[constraintName].[errorType] = [customMessage]

[constraintName]には、制約アノテーションの名前がそのまま入ります。@Requiredアノテーションの場合は"Required"となります。

[errorType]には、エラーの種類を示す識別子が入ります。この識別子は、制約によって異なります。例えば@IntRangeアノテーションの場合、

min.failed = 入力は {min} 以上でなければいけません。
max.failed = 入力は {max} 以下でなければいけません。
both.failed = 入力は {min} 以上 {max} 以下でなければいけません。

の3種類が定義されています。詳細はAPIドキュメントを参照してください。

実際の記述例として、example.Modelクラスのageプロパティに@IntRange制約があり、この制約違反のメッセージをカスタマイズするケースを考えます。 この場合は、example/resources/Model.propertiesファイルに

age.IntRange.min.failed = 入力は最低 {min} 歳からです。
age.IntRange.max.failed = 入力は最高 {max} 歳までです。
age.IntRange.both.failed = 入力は {min} 歳から {max} 歳までです。

のように記述します。

カスタムバリデーション

以下の手順にしたがって、独自のバリデーションを定義することができます。

制約クラスの作成

Constraintインタフェースを実装し、制約クラスを作成します。 このとき、AbstractConstraintクラスを継承すると便利です。

制約クラスの指定

制約を課したいモデルクラスのプロパティに対し、定義済み制約アノテーションの代わりに @CustomConstraintアノテーションを付加し、独自に作成した制約クラス名を引数で指定します。

例えば、ModelクラスのaddressプロパティにMyConstraintという制約クラスを適用したい場合には、

public class Model {
    @CustomConstraint(type = MyConstraint.class)
    private String address;

    public String getAddress() { return address; }
    public void setAddress(String address) { this.address = address; }
}

のように指定します。

Copyright © 2008-2009 The Seasar Foundation and the others. All rights reserved.