1概要

この簡単な記事では、標準のフレームワーク – JSR 380(__Bean Validation 2.0) – を使って

Java beanを検証するための基本

を詳しく説明します。

ユーザー入力の検証は、もちろん、ほとんどのアプリケーションで非常に一般的な要件です。JavaBean Validationフレームワークは、この種のロジックを処理するための事実上の標準になりました。


2 JSR 380

JSR 380は、Beanの検証用のJava API、JavaEEおよびJavaSEの一部であり、

@ NotNull



@ Min



@ Max

などのアノテーションを使用して、Beanのプロパティが特定の基準を満たすことを保証します。

このバージョンはJava 8以上を必要とし、型注釈のようなJava 8に追加された新機能を利用し、

Optional



LocalDate

のような新しい型をサポートします。

仕様の詳細については、https://jcp.org/en/jsr/detail?id = 380[JSR 380]を参照してください。


3依存関係

必要な依存関係を示すためにMavenの例を使用しますが、もちろん、これらのjarはさまざまな方法で追加できます。


3.1. 検証API

JSR 380仕様に従って、

validation-api

依存関係には標準の検証APIが含まれています。

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.0.Final</version>
</dependency>


3.2. 検証APIリファレンスの実装

Hibernate ValidatorはバリデーションAPIのリファレンス実装です。

それを使用するには、以下の依存関係を追加する必要があります。

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.2.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator-annotation-processor</artifactId>
    <version>6.0.2.Final</version>
</dependency>

ここでちょっと注意してください。


hibernate-validator

はHibernate

の永続性の側面とはまったく別のものです。依存関係として追加することで、これらの永続性の側面をプロジェクトに追加しません。


3.3. 式言語の依存関係

JSR 380は変数の内挿をサポートし、違反メッセージ内の式を許可します。

これらの式を解析するには、式言語APIとそのAPIの実装の両方に依存関係を追加する必要があります。 GlassFishは参照実装を提供します。

<dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>3.0.0</version>
</dependency>

<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>javax.el</artifactId>
    <version>2.2.6</version>
</dependency>

これらのJARが追加されていないと、実行時に以下のようにエラーメッセージが表示されます。


HV000183: ‘javax.el.E​​xpressionFactory’をロードできません。





















































































































































































クラスパスに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


    – 注釈付きプロパティ値がそうでないことを検証します。


ヌル




@ AssertTrue

** – 注釈付きプロパティ値が







@ Size

** – 注釈付きプロパティ値にサイズがあることを検証します。

属性

min



max

の間。

String

に適用できます。

Collection



Map

、および配列のプロパティ



@ Min

** – 注釈付きプロパティの値がnoであることを

__v

__Validates


value

属性よりも小さい



@ Max

** – 注釈付きプロパティの値がそれ以下であることを検証


value

属性より




@ Email ** – 注釈付きプロパティが有効なEメールであることを検証します。

住所

いくつかのアノテーションは追加の属性を受け付けますが、

message

属性はそれらすべてに共通です。これは、それぞれのプロパティの値が検証に失敗したときに通常表示されるメッセージです。

JSRにある追加の注釈は次のとおりです。



  • @ NotEmpty


    – プロパティがnullまたは空ではないことを検証します。できる


String



Collection



Map

、または

Array

の値に適用される




@ NotBlank ** – テキスト値にのみ適用でき、それを検証できます。

プロパティがnullまたは空白ではない




@ Positive

および



@ PositiveOrZero ** – 数値に適用

厳密に正、または0を含む正であることを検証する




@負

および



@ NegativeOrZero ** – 数値に適用され、

厳密に負、または0を含む負であることを検証します




@ Past

および



@ PastOrPresent ** – 日付値があることを検証します。

過去または現在を含む過去。日付タイプに適用できます
Java 8で追加されたものを含む




@ Future

および

@ FutureOrPresent ** – 日付値があることを検証します。

未来、あるいは現在を含む未来

  • 検証アノテーションはコレクションの要素にも適用できます。

List<@NotBlank String> preferences;

この場合、設定リストに追加された値はすべて検証されます。

仕様

は、Java 8の新しい

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の定義

次に、無効な

name

値を使用してこの無効なユーザーを設定します。

User user = new User();
user.setWorking(true);
user.setAboutMe("Its all about me!");
user.setAge(50);


5.2. Beanを検証する


Validator

ができたので、それを

validate

メソッドに渡すことでBeanを検証できます。

User

オブジェクトで定義されている制約の違反は

Set

として返されます。

Set<ConstraintViolation<User>> violations = validator.validate(user);

違反を繰り返すことで、

getMessage

メソッドを使用してすべての違反メッセージを取得できます。

for (ConstraintViolation<User> violation : violations) {
    log.error(violation.getMessage());
}

この例(

ifNameIsNull

nameValidationFails

)では、セットに単一の

ConstraintViolation

が含まれ、メッセージ「

Nameをnull__にすることはできません。


6. 結論

このチュートリアルでは、標準のJava Validation APIの単純なパスに焦点を当て、

javax.validation

アノテーションとAPIを使用したBean検証の基本について説明しました。

この記事の中で概念のこの実装はGitHubプロジェクトで見つけることができます。今後の記事では、JSR 380とHibernate Validatorのより多くの機能を紹介します。

すべてのコードスニペットが見つかります

over on
GitHub。