Spring Framework のエラーメッセージ周りで詰まって調べたところを忘備録としてまとめてみる。
DefaultMessageCodesResolverとは?
バリデーションによって作られたエラーコードからメッセージコードを作成するクラス。
オブジェクトやフィールドに対するメッセージコード一覧を作るためにDataBinder
から呼ばれる。
MessageCodeResolver
インターフェースの実装クラスで、名前の通りデフォルトで実行される。
どうやってメッセージコードを作るのか?
DefaultMessageCodesResolver (Spring Framework 5.2.7.RELEASE API)
JavaDocを読むと、以下の2つのアルゴリズムでメッセージコード作ると書いてある。
オブジェクトエラー用のメッセージコードを2つ作る
以下を作成する。
code.objectName
code
codeとはエラーコードを指している。
例えばcodeがrequired
, objectNameがaccount
だとすると、作られるメッセージコードは、required.account
とrequired
になる。
フィールド用のメッセージコードを4つ作る
以下を作成する。
code.objectName.field
code.field
code.filedType
code
例えばcodeがtypeMismatch
, objectNameがaccount
, fieldがaccountId
(型はString)だとすると、作られるメッセージコードは、typeMismatch.account.accountId
, typeMismatch.accountId
, typeMismatch.java.lang.String
, typeMismatch
になる。
fieldの型が配列やListやMapの場合には、以下のようなメッセージコードを作ることができる
- required.account.users[0].name
- required.account.users.name
- required.account.users[0]
- required.account.users
- required.java.lang.String
これがあると何が嬉しいのか?
特定のオブジェクトの特定のフィールドの特定のエラーにはこのエラーメッセージを表示させる、とか、特定のオブジェクトの特定の型の特定のエラーにはこのエラーメッセージを表示させるといった、エラーメッセージの出しわけをおこなうことができる。
実際のコードではどうなっている?
エラーコードからメッセージコードを作成する処理の実際のコードは以下
その他
生成するメッセージコードにprefixを指定することができる。デフォルトではなにもつけない設定になっている。 他にも、messageCodeFormatterプロパティを変更することで、メッセージコードの形式を指定することもできる。デフォルトではエラーコードを先頭につける形式になっている。
参考資料
DefaultMessageCodesResolver (Spring Framework 5.2.7.RELEASE API)
This entry is released under version 2.0 of the Apache License.