覆盖 Spring 表单错误消息

Override Spring form error messages

在 Spring 中,我如何覆盖默认的表单错误信息?

我正在使用 Validator 和属性文件来添加我自己的错误消息,但是 例如,如何覆盖在 conversion/encoding 错误时打印的消息?

它们似乎是自动生成的,我认为对用户没有帮助:

Failed to convert property value of type java.lang.String to required type java.lang.Double for property minPrice; nested exception is java.lang.NumberFormatException: 

您可以通过使用遵循 Spring 的 DefaultMessageCodeResolver 定义的约定的键在您的本地化包中创建自定义消息来覆盖默认值。为了完整起见,这里是其文档的相关部分:

Will create two message codes for an object error, in the following order (when using the prefixed formatter):

1.: code + "." + object name
2.: code 

Will create four message codes for a field specification, in the following order:

1.: code + "." + object name + "." + field
2.: code + "." + field
3.: code + "." + field type
4.: code 

For example, in case of code "typeMismatch", object name "user", field "age":

1. try "typeMismatch.user.age"
2. try "typeMismatch.age"
3. try "typeMismatch.int"
4. try "typeMismatch" 

This resolution algorithm thus can be leveraged for example to show specific messages for binding errors like "required" and "typeMismatch":

at the object + field level ("age" field, but only on "user");
at the field level (all "age" fields, no matter which object name);
or at the general level (all fields, on any object). 

In case of array, List or Map properties, both codes for specific elements and for the whole collection are generated. Assuming a field "name" of an array "groups" in object "user":

1. try "typeMismatch.user.groups[0].name"
2. try "typeMismatch.user.groups.name"
3. try "typeMismatch.groups[0].name"
4. try "typeMismatch.groups.name"
5. try "typeMismatch.name"
6. try "typeMismatch.java.lang.String"
7. try "typeMismatch" 

By default the errorCodes will be placed at the beginning of constructed message strings. The messageCodeFormatter property can be used to specify an alternative concatenation format.

In order to group all codes into a specific category within your resource bundles, e.g. "validation.typeMismatch.name" instead of the default "typeMismatch.name", consider specifying a prefix to be applied.