メッセージ管理
このページでは、メッセージの管理方法について記載します。 メッセージは、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 を参照してください。