メッセージ管理

このページでは、メッセージの管理方法について記載します。 メッセージは、Jakarta Bean Validationを使った入力値チェックで使用するエラーメッセージと、それ以外のメッセージで管理方法が異なります。

以下のサンプルコードの動作確認環境については、 動作確認環境と依存ライブラリについて を参照してください。

Jakarta Bean Validationを使った入力値チェックのエラーメッセージ

Spring Bootでは、入力値のチェックとしてJakarta Bean Validationをサポートしており、実装ライブラリとして Hibernate Validator を採用しています。 デフォルトでは、Hibernate Validatorで定義されているロケール毎のValidationMessages.properties(例えば ValidationMessages_ja.properties )からエラーメッセージが生成されます。

デフォルトのエラーメッセージを変更したい場合は、以下のどちらかのファイルに、デフォルトから変更したいエラーメッセージを定義します。

  • Springのメッセージ定義ファイル(クラスパス直下のmessages.properties)

  • Hibernate Validatorのメッセージ定義ファイル(クラスパス直下のValidationMessages.propertiesやValidationMessages_ja.properties等)

エラーメッセージの解決では、まずSpringのメッセージ定義ファイルが使用されます。(エラーメッセージ解決の詳細については エラーメッセージの解決 を参考にしてください)

Springのメッセージ定義ファイルにエラーメッセージが定義されていなければ、Hibernate Validatorのメッセージ定義ファイルが使用されます。(Hibernate Validatorのエラーメッセージ解決の詳細については エラーメッセージの補完 を参考にしてください)

エラーメッセージには、Jakarta Bean ValidationやHibernate Validatorの入力チェックアノテーションで定義されている属性名を、プレースホルダとして定義できます。 例えば、 @Length を用いて入力値チェックを実施した場合は、プレースホルダとして {min}、{max} が使用できます。

実装例

ValidationMessages.properties
javax.validation.constraints.NotEmpty.message=必須項目です。
javax.validation.constraints.NotNull.message=必須項目です。
org.hibernate.validator.constraints.Length.message={max}文字以内で入力してください。

サンプル全体は validation-sample を参照してください。

その他のメッセージ

Jakarta Bean Validationを使った入力値チェック以外で使用するメッセージは、Springのメッセージ定義ファイル(クラスパス直下のmessages.properties)にメッセージを定義します。 例えば、データベースを使用した入力値のチェックや入力値の型変換エラーが発生した場合、登録処理の完了時に使用するメッセージ等はmessages.propertiesに定義します。 messages.propertiesに定義したメッセージは、SpringのMessageSourceを使用して取得します。

messages.propertiesでは、プレースホルダを {0}、{1} のような連番で定義します。 プレースホルダに値を埋め込みたい場合は、 MessageSource#getMessage の第二引数に埋め込む値を設定します。

実装例

messages.properties
typeMismatch.java.lang.Integer=数値で入力してください。
typeMismatch.keel.validation.value.MailAddress=メールアドレス形式(sample@example.com)で入力してください。
role.notFound=ロールにはadmin以外登録出来ません。
mailAddress.duplicated=入力されたメールアドレスは登録済みです。
add.success={0}の登録を完了しました。
MessageSourceを使用したメッセージの取得
private final MessageSource messageSource;

public AddUserController(final UserService userService, MessageSource messageSource) {
    this.userService = userService;
    this.messageSource = messageSource;
}
// MessageSourceから完了メッセージを取得して、Flashスコープに設定します。
// プレースホルダに、「ユーザ」を設定します。
redirectAttributes.addFlashAttribute("successMessage",
        messageSource.getMessage("add.success", new String[]{"ユーザ"}, LocaleContextHolder.getLocale()));

サンプル全体は validation-sample を参照してください。