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