如何为Spring MVC中的数据转换失败个性化消息?

时间:2014-07-08 13:07:09

标签: spring-mvc

我有一个Spring MVC Web应用程序如下:

@Controller
@RequestMapping("/users")
public class UserController extends FrontEndController {

    @RequestMapping(method = RequestMethod.POST)
    public String post(@Valid @ModelAttribute("user") User user, Errors errors, Model model) {
        ...
    }
}

class User {
    @NotBlank(message = "user name is mandatory")
    String userName;

    public enum Color {RED, GREEN, YELLO}

    @NotNull(message = "color is mandatory)
    private Color color;
    // getters and setters
}

当我的Web控制器验证用户时,如果未指定此参数,则会显示“颜色是必需的”。此消息显示在Web表单中。但是,如果字符串“BLUE”传递给颜色(这不是3个枚举选项之一),我会收到如下消息:

Failed to convert property value of type java.lang.String to required type User$Color for property color; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @javax.validation.constraints.NotNull User$Color for value BLUE; nested exception is java.lang.IllegalArgumentException: No enum constant User.Color.BLUE.

此消息显示在网络表单中。

正如How to personality error message for hibernate validator enum?所指出的,这条消息与验证者没有任何关系;在验证程序运行之前创建此消息。 Spring尝试将字符串“BLUE”转换为枚举,因此它失败并生成此消息。

那么,我怎么能告诉Spring MVC个性化这个消息呢? 而不是“无法将类型java.lang.String的属性值转换为...”,我想说一些简单的“无效颜色”。

1 个答案:

答案 0 :(得分:6)

您可以在相同的.properties文件中定义这些消息,您可以在其中为Spring MVC国际化/本地化定义消息(您也可以对它们进行本地化)。它适用于:验证(JSR-303)和数据绑定(数据转换)错误。

消息的格式描述为here

This question解释了如何配置资源包(它是您用英语定义消息所需的全部内容)。实施国际化将需要进一步配置。请参阅this教程中的外化和国际化部分。