1. 概要

Java JSR 380の機能の1つは、検証メッセージをパラメーターで補間しながら式を許可することです。

Hibernate Validatorを使用する場合、プロジェクトへの依存関係としてJavaJSR341の統一された実装の1つを追加する必要があるという要件があります。JSR341はExpressionLanguageAPIとも呼ばれます。

ただし、ユースケースに従って式の解析をサポートする必要がない場合は、ライブラリを追加するのが面倒な場合があります。

この短いチュートリアルでは、HibernateValidatorでParameterMessageInterpolatorを構成する方法を見ていきます。

2. メッセージ補間器

Java bean の検証の基本を超えて、Bean検証APIの MessageInterpolator は、式を解析する手間をかけずに単純な補間を実行する方法を提供する抽象化です。 。

さらに、 Hibernate Validatorは非式ベースのParameterMessageInterpolatorを提供するため、構成するために追加のライブラリは必要ありません。

3. カスタムメッセージ補間器の設定

式言語の依存関係を削除するために、カスタムメッセージインターポレーターを使用して、式をサポートせずにHibernateValidatorを構成できます。

カスタムメッセージ補間器を設定する便利な方法のいくつかを示しましょう。 この場合、組み込みのParameterMessageInterpolatorを使用します。

3.1. ValidatorFactoryの構成

カスタムメッセージ補間器を設定する1つの方法は、ブートストラップ時にValidatorFactoryを構成することです。

したがって、ParameterMessageInterpolatorを使用してValidatorFactoryインスタンスを構築できます。

ValidatorFactory validatorFactory = Validation.byDefaultProvider()
  .configure()
  .messageInterpolator(new ParameterMessageInterpolator())
  .buildValidatorFactory();

3.2. バリデーターの構成

同様に、 Validator インスタンスを初期化するときに、ParameterMessageInterpolatorを設定できます。

Validator validator = validatorFactory.usingContext()
  .messageInterpolator(new ParameterMessageInterpolator())
  .getValidator();

4. 検証の実行

ParameterMessageInterpolator がどのように機能するかを確認するには、いくつかのJSR380アノテーションが付いたサンプルJavaBeanが必要です。

4.1. サンプルJavaBean

サンプルJavabeanPersonを定義しましょう。

public class Person {

    @Size(min = 10, max = 100, message = "Name should be between {min} and {max} characters")
    private String name;

    @Min(value = 18, message = "Age should not be less than {value}")
    private int age;

    @Email(message = "Email address should be in a correct format: ${validatedValue}")
    private String email;

    // standard getters and setters
}

4.2. メッセージパラメータのテスト

確かに、検証を実行するには、 ValidatorFactory、からアクセスした Validator インスタンスを使用する必要があります。これは、の前に構成済みです。

したがって、Validatorにアクセスする必要があります。

Validator validator = validatorFactory.getValidator();

その後、nameフィールドのテストメソッドを記述できます。

@Test
public void givenNameLengthLessThanMin_whenValidate_thenValidationFails() {
    Person person = new Person();
    person.setName("John Doe");
    person.setAge(18);

    Set<ConstraintViolation<Person>> violations = validator.validate(person);
 
    assertEquals(1, violations.size());

    ConstraintViolation<Person> violation = violations.iterator().next();
 
    assertEquals("Name should be between 10 and 100 characters", violation.getMessage());
}

検証メッセージは、{min}および{max}の変数で正しく補間されます。

Name should be between 10 and 100 characters

次に、ageフィールドに対して同様のテストを作成しましょう。

@Test
public void givenAgeIsLessThanMin_whenValidate_thenValidationFails() {
    Person person = new Person();
    person.setName("John Stephaner Doe");
    person.setAge(16);

    Set<ConstraintViolation<Person>> violations = validator.validate(person);
 
    assertEquals(1, violations.size());

    ConstraintViolation<Person> violation = violations.iterator().next();
 
    assertEquals("Age should not be less than 18", violation.getMessage());
}

同様に、検証メッセージは、期待どおりに変数{value}で正しく補間されます。

Age should not be less than 18

4.3. 式のテスト

ParameterMessageInterpolator が式でどのように動作するかを確認するために、単純な ${validatedValue}式を含むemailフィールドの別のテストを記述してみましょう。

@Test
public void givenEmailIsMalformed_whenValidate_thenValidationFails() {
    Person person = new Person();
    person.setName("John Stephaner Doe");
    person.setAge(18);
    person.setEmail("johndoe.dev");
    
    Set<ConstraintViolation<Person>> violations = validator.validate(person);
 
    assertEquals(1, violations.size());
    
    ConstraintViolation<Person> violation = violations.iterator().next();
 
    assertEquals("Email address should be in a correct format: ${validatedValue}", violation.getMessage());
}

今回は、式 ${validatedValue}は補間されません。

ParameterMessageInterpolatorは、パラメーターの補間のみをサポートし、$表記を使用する式の解析はサポートしません。代わりに、パラメーターを補間せずに返すだけです。

5. 結論

この記事では、 ParameterMessageInterpolator の目的と、HibernateValidatorでの構成方法について学習しました。

いつものように、このチュートリアルに含まれるすべての例は、GitHubから入手できます。