Spring Bootのカスタム検証メッセージソース

1概要

MessageSource は、Springアプリケーションで利用できる強力な機能です。

これにより、アプリケーション開発者は、環境固有の設定、国際化、設定可能な値など、さらに多くのコードを記述してさまざまな複雑なシナリオを処理できます。

もう1つのシナリオは、デフォルトの検証メッセージをよりユーザーフレンドリな/カスタムメッセージに変更することです。

このチュートリアルでは、Spring Bootを使ってアプリケーションのカスタム検証 MessageSource を設定および管理する方法を説明します。

2 Mavenの依存関係

必要なMavenの依存関係を追加することから始めましょう。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

https://search.maven.org/classic/#search%7Cga%7C1%7C(g%3A%22org.springframework.boot%22%20AND%20(a%にこれらのライブラリの最新バージョンがあります。 3A%22スプリングブートスターター検証%22%20OR%20a%3A%22スプリングブートスターターweb%22))[Maven Central]。

3カスタム検証メッセージの例

多言語をサポートするアプリケーションを開発しなければならないシナリオを考えてみましょう。ユーザーが入力として正しい情報を入力しない場合は、ユーザーの地域に応じてエラーメッセージを表示します

LoginフォームBeanの例を見てみましょう。

public class LoginForm {

    @NotEmpty(message = "{email.notempty}")
    @Email
    private String email;

    @NotNull
    private String password;

   //standard getter and setters
}

ここでは、電子メールがまったく提供されていないか、提供されているが標準の電子メールアドレススタイルに従っていないかを検証する検証制約を追加しました。

カスタムおよびロケール固有のメッセージを表示するために、 @ NotEmpty アノテーションで説明したようにプレースホルダーを提供できます。

__email.notempty propertyは、 MessageSource__設定によってプロパティファイルから解決されます。

4. _ MessageSource _ Bean の定義

アプリケーションコンテキストは、正確な名前__messageSourceを持つBeanにメッセージ解決を委任します

ReloadableResourceBundleMessageSource は、さまざまなロケールのリソースバンドルからのメッセージを解決する最も一般的な MessageSource 実装です。

@Bean
public MessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource
      = new ReloadableResourceBundleMessageSource();

    messageSource.setBasename("classpath:messages");
    messageSource.setDefaultEncoding("UTF-8");
    return messageSource;
}

ここでは、ロケール固有のファイル名が提供された名前に基づいて解決されるので、 basename を提供することが重要です。

5 LocalValidatorFactoryBean の定義

  • LocalValidatorFactoryBean を定義して__messageSourceを登録する必要があるように、プロパティファイルでカスタムネームメッセージを使用するには、

@Bean
public LocalValidatorFactoryBean getValidator() {
    LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
    bean.setValidationMessageSource(messageSource());
    return bean;
}

ただし、 WebMvcConfigurerAdapter をすでに拡張している場合は、カスタムバリデータを無視しないようにするために、親クラスの getValidator() メソッドをオーバーライドしてバリデータを設定する必要があります。

これでプロパティメッセージを次のように定義できます。

email.notempty = <Custom Message>” __

の代わりに

“ javax.validation.constraints.NotEmpty.message = <カスタムメッセージ>”

[["defining-property-files]]

6. プロパティファイルの定義

  • 最後のステップは、ステップ4で basename に指定された名前で src/main/resources ディレクトリーにプロパティー・ファイルを作成することです。**

# messages.properties
email.notempty=Please provide valid email id.

ここで私たちはこれと共に国際化を利用することができます。

フランス語のユーザーへのメッセージを彼らの言語で表示したいとしましょう。

この場合、同じ場所に messages fr.properties__という名前のプロパティファイルをもう1つ追加する必要があります(コードの変更はまったく必要ありません)。

# messages__fr.properties
email.notempty=Veuillez fournir un identifiant de messagerie valide.

7. 結論

この記事では、構成が事前に正しく行われている場合にコードを変更せずにデフォルトの検証メッセージを変更する方法について説明しました。

これと合わせて国際化のサポートを活用して、アプリケーションをよりユーザーフレンドリーにすることもできます。

いつものように、完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-boot-mvc[over on GitHub]から入手可能です。