daisuzz.log

【Spring】DefaultMessageCodesResolverについて調べてみた

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.accountrequiredになる。

フィールド用のメッセージコードを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

これがあると何が嬉しいのか?

特定のオブジェクトの特定のフィールドの特定のエラーにはこのエラーメッセージを表示させる、とか、特定のオブジェクトの特定の型の特定のエラーにはこのエラーメッセージを表示させるといった、エラーメッセージの出しわけをおこなうことができる。

実際のコードではどうなっている?

エラーコードからメッセージコードを作成する処理の実際のコードは以下

spring-framework/DefaultMessageCodesResolver.java at 02da8486a3c1cf34893be3096dbd95abfb44fd0f · spring-projects/spring-framework · GitHub

その他

生成するメッセージコードにprefixを指定することができる。デフォルトではなにもつけない設定になっている。 他にも、messageCodeFormatterプロパティを変更することで、メッセージコードの形式を指定することもできる。デフォルトではエラーコードを先頭につける形式になっている。

参考資料

DefaultMessageCodesResolver (Spring Framework 5.2.7.RELEASE API)

spring-framework/DefaultMessageCodesResolver.java at 02da8486a3c1cf34893be3096dbd95abfb44fd0f · spring-projects/spring-framework · GitHub

This entry is released under version 2.0 of the Apache License.