バリデーションの実践的な使用手順については、チュートリアルを参照してください。
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; }
}
のように指定します。