春季数据绑定(@ModelAttribute)妥善处理解析异常(Spring databinding

2019-10-21 19:53发布

我开始学习使用Spring MVC的验证注解。 到目前为止,一切都进展顺利,但现在我已经遇到其已经停止在我的轨道的问题。 当从网页场返回的字符串被解析成一个长一个异常被抛出,但是字符串包含非数字字符。 虽然预期的行为,呈现用户友好的错误消息被证明是一个挑战。

我到目前为止有:

在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;
}

Item类的成员,他们所有的工作验证注解预期。

从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

我想保持它最少量的额外的代码,但如果唯一的办法就是创建自己的验证,我可能会走这路线。 是否有任何其他的方式来处理异常,并返回一个更好的错误信息?

谢谢!

对不起,这不是可运行的代码,但我不能发表任何更多。

Answer 1:

您需要定义自定义转换错误消息。 假设你有一个MessageSource在Spring配置设置,像这样添加一些属性文件,其中包含您的翻译信息:

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

这将覆盖缺省的用户不友好的消息未能整数转换。 同样,您可以定义其他数据类型,如转换错误信息:

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

您还可以定义转换错误消息的具体领域,而不是一般的数据类型。 看到我的其他SO发布有关此的更多细节。


如果你没有MessageSource配置,例如,你可以这样做,如果你使用Java的配置:

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


文章来源: Spring databinding (@modelattribute) gracefully handle parse exceptions