在我的模型中,我使用数字类型,如Long,Integer等。 当我形成它们的帖子,但提供String时,它输出Exception堆栈跟踪,包括类似NumberFormatException。 如何正确地包装它以便UI不会看到异常堆栈跟踪?
答案 0 :(得分:2)
你需要在控制器中的命令参数(带BindingResult
注释)之后有一个@Value
参数。然后你可以检查bindingResult
并决定如何处理那些无法绑定的东西。
当你有BindingResult
参数时,即使出现绑定错误,也会调用控制器方法,你必须自己处理错误。
通常它看起来有点像这个例子(创建用户或再次渲染用户创建页面):
@RequestMapping(method = RequestMethod.POST)
public ModelAndView create(@Valid UserCreateCommand userCreateCommand,
BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
//or some of your handling for bindingResult errors
return new ModelAndView("user/create", userCreateCommand", userCreateCommand);
} else {
...
}
}
但是,如何区分正常的验证错误与由于NumberFormatException引起的验证错误?
BindingResult
有几种获取FieldErrors
的方法,例如BindingResult.getFieldErrors()
。并且FieldError
具有属性boolean isBindingFailure()
答案 1 :(得分:1)
如果要显示该异常的自定义消息,则应将Spring配置为使用message.properties文件,并为typeMismatch指定“typeMismatch.className.propertyName”消息或全局消息。
例如(Spring 3.2):在servlet-config.xml
中<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource"
p:basename="classpath:messages/messages">
</bean>
在src / main / resources / messages / messages.properties
中typeMismatch = Invalid data format!
在控制器中:
public String addObject(@Valid @ModelAttribute("objectForm")
ObjectForm objectForm, BindingResult result, Model model)
{
if (result.hasErrors())
{
return "/addObject";
}
//...
}
在jsp中:
<form:errors path="propertyName" cssClass="divErrorsServer" element="div" />
您也可以使用:
System.out.println(result.getAllErrors());
要查看您可以在消息文件中为该错误添加哪些代码。例如,当我在private Double weight
字段上使用String时,我得到了这些代码:
[typeMismatch.objectForm.weight,
typeMismatch.weight,
typeMismatch.java.lang.Double,
typeMismatch]