Spring数据绑定(@modelattribute)可以优雅地处理解析异常

时间:2015-02-07 11:00:49

标签: java spring spring-mvc exception annotations

我开始学习使用Spring MVC的验证注释。 到目前为止,一切进展顺利,但现在我遇到了一个问题,这个问题一直困扰着我。 从网页字段返回的字符串被解析为Long时,抛出异常,但该字符串包含非数字字符。虽然预期的行为,但提出用户友好的错误消息被证明是一个挑战。

到目前为止我所拥有的:

在webpage.jsp中,Spring错误显示在:

<form:errors path="numberField" cssclass="error"></form:errors>

在网页的控制器中,我们有:

@RequestMapping(method = RequestMethod.POST)
public String post(Model model, @Valid @ModelAttribute Item item, BindingResult bindingResult) {

//Stuff

return "redirect:" + ITEM_PAGE;
}

项目类对成员进行验证注释,它们都按预期工作。

从相应字段旁边的jsp上的bindingResult返回的错误消息是:

Failed to convert property value of type java.lang.String to required type java.lang.Long for property quantity; nested exception is java.lang.NumberFormatException: For input string: "n0t"

正如我上面所说,这并不意外,但我想用

之类的内容替换该消息。
Please input a number

我想保留最少的额外代码,但如果唯一的方法是创建我自己的验证器,我可能会沿着那条路走下去。有没有其他方法来处理异常并返回更好的错误消息?

谢谢!

很抱歉这不是可运行的代码,但我不能再发布了。

1 个答案:

答案 0 :(得分:3)

您需要定义自定义转换错误消息。假设您在Spring配置中设置了MessageSource,请将类似内容添加到包含翻译消息的属性文件中:

typeMismatch.java.lang.Integer = Please enter a number

这将覆盖失败的整数转换的默认用户不友好消息。同样,您可以为其他数据类型定义转换错误消息,例如:

typeMismatch.java.time.LocalDate = Enter a valid date

您还可以为特定字段定义转换错误消息,而不是一般的数据类型。有关详细信息,请参阅我的other SO post


如果您没有配置MessageSource,那么如果您使用Java配置,则可以这样做:

@Bean
public MessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("/WEB-INF/messages/messages");
    return messageSource;
}