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<? extends Payload>[] 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;
}

🗻 参考リンク

📚 おすすめの書籍

🖥 サーバについて

このブログでは「Cloud Garage」さんのDev Assist Program(開発者向けインスタンス無償提供制度)でお借りしたサーバで技術検証しています。 Dev Assist Programは、開発者や開発コミュニティ、スタートアップ企業の方が1GBメモリのインスタンス3台を1年間無料で借りれる心強い制度です!(有償でも1,480円/月と格安)