Java Bean検証の基本
1. 概要
この簡単な記事では、標準フレームワークであるJSR 380(Bean Validation 2.0.とも呼ばれます)を使用してthe basics of validating a Java beanについて説明します。
もちろん、ユーザー入力の検証はほとんどのアプリケーションで非常に一般的な要件であり、Java Bean Validationフレームワークはこの種のロジックを処理するための事実上の標準になっています。
参考文献:
Spring Bootでの検証
Bean Validationフレームワークのリファレンス実装であるHibernate Validatorを使用して、Spring Bootでドメインオブジェクトを検証する方法を学びます。
2. JSR 380
JSR 380は、JavaEEおよびJavaSEの一部であるBean検証用のJava APIの仕様であり、@NotNull、@Min、%((t1)sなどのアノテーションを使用してBeanのプロパティが特定の基準を満たしていることを確認します。 t2)s。
このバージョンはJava8以降を必要とし、型注釈などのJava 8で追加された新機能を利用し、OptionalやLocalDateなどの新しい型をサポートします。
仕様の詳細については、先に進んでJSR 380を読んでください。
3. 依存関係
Mavenの例を使用して必要な依存関係を示しますが、もちろん、これらのjarはさまざまな方法で追加できます。
3.1. 検証API
JSR 380仕様によると、validation-api依存関係には標準の検証APIが含まれています。
javax.validation
validation-api
2.0.0.Final
3.2. 検証APIリファレンス実装
Hibernate Validatorは、検証APIのリファレンス実装です。
それを使用するには、次の依存関係を追加する必要があります。
org.hibernate.validator
hibernate-validator
6.0.2.Final
org.hibernate.validator
hibernate-validator-annotation-processor
6.0.2.Final
ここでの簡単な注意点は、hibernate-validator is entirely separate from the persistence aspects of Hibernateであり、依存関係として追加することにより、これらの永続性の側面をプロジェクトに追加しないことです。
3.3. 式言語の依存関係
JSR 380は、変数補間のサポートを提供し、違反メッセージ内の式を許可します。
これらの式を解析するには、式言語APIとそのAPIの実装の両方に依存関係を追加する必要があります。 GlassFishはリファレンス実装を提供します:
javax.el
javax.el-api
3.0.0
org.glassfish.web
javax.el
2.2.6
これらのJARが追加されない場合、以下に示すように、実行時にエラーメッセージが表示されます。
HV000183:「javax.el.ExpressionFactory」を読み込めません。 クラスパスにELの依存関係があることを確認するか、代わりにParameterMessageInterpolatorを使用してください
4. 検証アノテーションの使用
ここでは、主な例としてUser Beanを使用し、それにいくつかの簡単な検証を追加する作業を行います。
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.constraints.Email;
public class User {
@NotNull(message = "Name cannot be null")
private String name;
@AssertTrue
private boolean working;
@Size(min = 10, max = 200, message
= "About Me must be between 10 and 200 characters")
private String aboutMe;
@Min(value = 18, message = "Age should not be less than 18")
@Max(value = 150, message = "Age should not be greater than 150")
private int age;
@Email(message = "Email should be valid")
private String email;
// standard setters and getters
}
この例で使用されるすべての注釈は、標準のJSR注釈です。
-
@NotNull –注釈付きプロパティ値がnullではないことを検証します
-
@AssertTrue –注釈付きプロパティ値がtrueであることを検証します
-
@Size –注釈付きプロパティ値のサイズが属性minとmaxの間であることを検証します。 String、Collection、Map、および配列プロパティに適用できます
-
@Min –v注釈付きプロパティの値がvalue属性以上であることを検証します
-
@Max –注釈付きプロパティの値がvalue属性以下であることを検証します
-
@Email –注釈付きプロパティが有効な電子メールアドレスであることを検証します
一部の注釈は追加の属性を受け入れますが、message属性はそれらすべてに共通です。 これは、通常、それぞれのプロパティの値が検証に失敗したときに表示されるメッセージです。
JSRで見つけることができる追加の注釈は次のとおりです。
-
@NotEmpty –プロパティがnullまたは空でないことを検証します。 String、Collection、Map、またはArrayの値に適用できます
-
@NotBlank –テキスト値にのみ適用でき、プロパティがnullまたは空白ではないことを検証できます
-
@Positiveおよび@PositiveOrZero –数値に適用し、それらが厳密に正、または0を含む正であることを検証します
-
@Negativeおよび@NegativeOrZero –数値に適用し、それらが厳密に負であるか、0を含む負であることを検証します
-
@Pastおよび@PastOrPresent –日付値が過去または現在を含む過去であることを検証します。 Java8で追加されたものを含む日付タイプに適用できます
-
*@Future* and *@FutureOrPresent* –日付値が将来、または現在を含む将来であることを検証します
The validation annotations can also be applied to elements of a collection:
List<@NotBlank String> preferences;
この場合、設定リストに追加された値が検証されます。
Java 8の仕様also supports the new Optional type:
private LocalDate dateOfBirth;
public Optional<@Past LocalDate> getDateOfBirth() {
return Optional.of(dateOfBirth);
}
ここで、検証フレームワークは自動的にLocalDate値をアンラップし、検証します。
5. プログラムによる検証
一部のフレームワーク(Springなど)には、注釈を使用するだけで検証プロセスをトリガーする簡単な方法があります。 これは主に、プログラムによる検証APIを操作する必要がないようにするためです。
それでは、手動ルートを使用して、プログラムで設定してみましょう。
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Beanを検証するには、最初にValidatorFactoryを使用して構築されたValidatorオブジェクトが必要です。
5.1. Beanの定義
次に、この無効なユーザーをnullname値で設定します。
User user = new User();
user.setWorking(true);
user.setAboutMe("Its all about me!");
user.setAge(50);
5.2. Beanを検証する
Validatorができたので、Beanをvalidateメソッドに渡すことでBeanを検証できます。 Userオブジェクトで定義された制約の違反は、Setとして返されます。
Set> violations = validator.validate(user);
違反を繰り返すことにより、getMessageメソッドを使用してすべての違反メッセージを取得できます。
for (ConstraintViolation violation : violations) {
log.error(violation.getMessage());
}
この例(ifNameIsNull_nameValidationFails)では、セットに単一のConstraintViolationが含まれ、「Name cannot be null」というメッセージが表示されます。
6. 結論
このチュートリアルでは、標準のJava Validation APIの簡単なパスに焦点を当て、javax.validationアノテーションとAPIを使用したBean検証の基本を説明しました。
この記事の概念の実装は、GitHubプロジェクトにあります。 今後の記事では、JSR380とHibernateValidatorのその他の機能について説明します。
すべてのコードスニペットはover on GitHub.で見つけることができます