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

Spring databinding (@modelattribute) gracefully handle parse exceptions

我已经开始学习使用 Spring MVC 的验证注释。 到目前为止,一切都进行得很顺利,但现在我遇到了一个让我停滞不前的问题。 将来自网页字段的 returned 字符串解析为 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;
}

项目 class 在成员上有验证注释,它们都按预期工作。

来自相应字段旁边 jsp 上的 bindingResult 的错误消息 return 是:

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

我希望将它的额外代码保持在最少数量,但如果唯一的方法是创建我自己的验证器,我可能会走这条路。是否有任何其他方法来处理异常和 return 更好的错误消息?

谢谢!

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

您需要定义自定义转换错误消息。假设您在 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;
}