我开始学习使用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
我想保留最少的额外代码,但如果唯一的方法是创建我自己的验证器,我可能会沿着那条路走下去。有没有其他方法来处理异常并返回更好的错误消息?
谢谢!
很抱歉这不是可运行的代码,但我不能再发布了。
答案 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;
}