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>

これらのライブラリの最新バージョンは、 MavenCentralで見つけることができます。

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

複数の言語をサポートするアプリケーションを開発する必要があるシナリオを考えてみましょう。 ユーザーが入力として正しい詳細を提供しない場合は、ユーザーのロケールに応じてエラーメッセージを表示したいと思います。

ログインフォームbeanの例を見てみましょう。

public class LoginForm {

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

    @NotNull
    private String password;

    // standard getter and setters
}

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

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

email.notempty プロパティは、MessageSource構成によってプロパティファイルから解決されます。

4.  MessageSourceBeanの定義

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

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 =

それ以外の

「javax.validation.constraints.NotEmpty.message=

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

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

# 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. 結論

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

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

いつものように、完全なソースコードはGitHubから入手できます。