フォームオブジェクトのString以外のフィールドに対して、変換不可能な値を送信した場合はorg.springframework.beans.TypeMismatchExceptionがスローされます。
エラー
「新規ユーザー登録」処理の例では「Age」フィールドはIntegerで定義されているが、このフィールドに対して整数に変換できない値を入力すると、以下のようなエラーメッセージが表示されます。

例外の原因がそのまま表示されてしまい、エラーメッセージとしては不適切であ李ますね。 型がミスマッチの場合のエラーメッセージは、org.springframework.context.MessageSourceが読み込むpropertiesファイル(application-messages.properties)に定義ができます。
application-messages.properties
メッセージを定義するときはいくつかのルールがありますが、以下となります。
| メッセージキー | メッセージ内容 | 用途 |
|---|---|---|
| typeMismatch | 型ミスマッチエラーのデフォルトメッセージ | システム全体のデフォルト値 |
| typeMismatch.対象のFQCN | 特定の型ミスマッチエラーのデフォルトメッセージ | システム全体のデフォルト値 |
| typeMismatch.フォーム属性名.プロパティ名 | 特定のフォームのフィールドに対する型ミスマッチエラーのメッセージ | 画面毎に変更したいメッセージ |
# typemismatch
typeMismatch="{0}" is invalid.
typeMismatch.int="{0}" must be an integer.
typeMismatch.double="{0}" must be a double.
typeMismatch.float="{0}" must be a float.
typeMismatch.long="{0}" must be a long.
typeMismatch.short="{0}" must be a short.
typeMismatch.java.lang.Integer="{0}" must be an integer.
typeMismatch.java.lang.Double="{0}" must be a double.
typeMismatch.java.lang.Float="{0}" must be a float.
typeMismatch.java.lang.Long="{0}" must be a long.
typeMismatch.java.lang.Short="{0}" must be a short.
typeMismatch.java.util.Date="{0}" is not a date.
# filed names
name=Name
email=Email
age=Age
上記のように定義しておくと次のようにメッセージが変換されます。

これで終わりですが、ユーザーの立場で例外の原因がそのまま表示されるよりわかりやすいし、簡略になりました。
参考
https://terasolunaorg.github.io/guideline/1.0.1.RELEASE/ja/ArchitectureInDetail/Validation.html
