Spring Frameworkのバリデーション


JavaのSpring Frameworkのバリデーションの機能(Bean Validation)に関する紹介です。数値なら最小値、最大値のチェックをしたり、文字列なら長さのチェックができます。

🎳 整数の最小値のチェック:@Min

最小値を指定するアノテーションでint, long, Integer, Longをサポートしています。

public class Book {
@Min(1) // 1未満の場合はバリデーションエラー
private int price;
}

🎉 整数の最大値のチェック:@Max

最大値を指定するアノテーションでint, long, Integer, Longをサポートしています。

public class Book {
@Max(1000000) // 1,000,000より大きい場合はバリデーションエラー
private int price;
}

🐠 オリジナルのバリデーションの追加

オリジナルのバリデーションを自作します。

アノテーション・クラス

まず、アノテーションのクラスは次のように定義します。

package com.example.validation;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Documented
@Constraint(validatedBy = {ArticleTitleValidator.class})
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface ArticleTitle {

String message() default "{com.example.validation.ArticleTitle.message}";

Class[] groups() default {};

Class[] payload() default {};
}

バリデーション・クラス

続いてバリデーションを行うクラスを定義します。

package com.example.validation;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

@Component
public class ArticleTitleValidator implements ConstraintValidator<ArticleTitle, String> {

@Autowired
ArticleService service;

@Override
public void initialize(ArticleTitle constraint) {
}

@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (StringUtils.isEmpty(value)) {
return true;
}

return service.findByTitle(value) == null;
}
}

メッセージの設定

バリデーション(Validation)時のメッセージを定義します。native2asciiでASCIIまたはUnicodeに変換します。

native2ascii
# 任意の文字を入力(or ファイルを与える)

変換された結果をValidationMessages.propertiesに定義します。(下のメッセージは「タイトルはユニークにしてください」です)

com.example.validation.ArticleTitle.message=\u30bf\u30a4\u30c8\u30eb\u306f\u30e6\u30cb\u30fc\u30af\u306b\u3057\u3066\u304f\u3060\u3055\u3044

Validatorの適用

package com.example.validation;

class Article {
@ArticleTitle
private String title;
}

🐡 参考リンク

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍