バリデーションの設定
今回のお題
今回のお題は、バリデーション(後編)です。
前回の作業で、データ型に対してはバリデーションとエラーメッセージが設定できました。
今回は、それ以外のバリデーション(文字数制限など)を設定していきます。
目次
ライブラリの追加
Spring Bootでは、ライブラリを追加することでバリデーションを簡単に実装可能です。
まずは、pom.xmlを編集してライブラリを追加します。
<dependencies>タグ内に以下を追加。
<groupId>org.springframework.boot</dependency>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
アノテーションのimport
Spring Bootでは、フィールド名の前にアノテーションをつけることで、そのアノテーションに対応したバリデーションが設定されます。
今回は、フィールドの定義はSignupForm.javaで行っているので、まずはこのファイルに必要なアノテーションをimportします。
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Min;
import javax.validation.constraints.Max;
import javax.validation.constraints.Pattern;
import javax.hibernate.validator.constraints.Length;
バリデーションの適用
次に、importしたアノテーションを用いてそれぞれのフィールドにバリデーションを設定していきます。
以下、代表的なアノテーションと使用例です。
@NotNull
指定したフィールドがnullでないことを要求します。
例)
@NotNull
private String userId;
@NotBlank
指定したフィールドがnull, 空文字、空白スペースでないことを要求します。
例)
@NotBlank
private string userName;
@Min, @Max
Integer型のフィールドに対して、最大値と最小値を設定します。
例)
@Min(20)
@Max(100)
private Integer age;
@Length
文字数の範囲を規定します。
例)
@Length(min = 4, max = 100)
private String password;
@Pattern
正規表現を用いてバリデーションをかけます。
例)
@Pattern(regexp = "^[a-zA-z-0-9]+$")
private String password;
これで、各フィールドに対してバリデーションが設定されました。
コントローラの編集
次に、コントローラを編集してバリデーションを有効にします。
やり方は簡単で、postSignupメソッドの引数部分を修正するだけです。
public String postSignup(Model model, Locale locale, @ModelAttribute @Validated SignupForm signupForm, BindingResult bindingresult){
.....以下略.......
}
@Validatedアノテーションをつけることで、postSignupメソッド内ではSignupFormクラスに対してバリデーションがかかります。
バリデーションメッセージの編集
最後にバリデーションメッセージの編集を行います。
以前にtypeMissmatchのエラーメッセージを記述するためにValidationMessages.propertiesとValidationMessages_en.propertiesを作成しました。
今回はそこにメッセージを追加していきます。
メッセージ例
NotBlank={0}は入力必須です。
NotNull={0}は入力必須です。
Max={0}は{1}以下で入力してください。
Min={0}は{1}以上で入力してください。
Length={0}は{2}文字以上{1}文字以下で入力してください。
メッセージを設定するためのルールは以下の3点です。
- "バリデーション名 = そのバリデーションに設定するメッセージ"の形式で記述する。
- {0}にはフィールド名、{1}以降にはそのバリデーションの引数が入る。
- Lengthなどの引数が複数あるものに関しては、どちらが{1}に対応するかはバリデーションの側であらかじめ決まっている。
Lengthでいえば、{1}は最大値で{2}が最小値。
また、この方法だとフィールド名に関しては変更されません。
例えば、userName→ユーザー名のように変更したければ、messages.propertiesを編集してください。