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

Spring Bootのカスタム検証MessageSource

1. 概要

MessageSourceは、Springアプリケーションで利用できる強力な機能です。 これにより、アプリケーション開発者は、環境固有の構成、国際化、構成可能な値などの追加コードを作成することで、さまざまな複雑なシナリオを処理できます。

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

このチュートリアルでは、we’ll see how to configure and manage custom validation MessageSource in the application using Spring Boot

2. Mavenの依存関係

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


    org.springframework.boot
    spring-boot-starter-web


    org.springframework.boot
    spring-boot-starter-validation

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

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

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

ログインフォーム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. Defining the 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 =

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

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

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

いつものように、完全なソースコードはover on GitHubで利用できます。