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;
}
我已经开始学习使用 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;
}