Spring MVC:绑定模型属性时防止异常

时间:2015-06-10 06:57:54

标签: java spring spring-mvc xss

在我的模型中,我使用数字类型,如Long,Integer等。 当我形成它们的帖子,但提供String时,它输出Exception堆栈跟踪,包括类似NumberFormatException。 如何正确地包装它以便UI不会看到异常堆栈跟踪?

2 个答案:

答案 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]