型のミスマッチ時にメッセージ変換

フォームオブジェクトの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

コメントを残す