在验证约束时,使用Bean Validation清除表单输入字段时遇到问题。我有一个不超过50个字符的表单输入,所以如果用户攻击页面并超出字符限制,我想显示一条消息并清除该字段。我试过清除绑定字段,但这不起作用。无论我做什么,缓存的值(bean验证拒绝的值)始终保留在输入字段中。我的代码如下:
JSP:
<form:form action="submit.do" method="POST" commandName="obj">
<form:input id="field1" path="field1" cssClass="box" size="50" maxlength="50"/>
<p><input class="action" type="submit" name="enter.x" value="Submit" /></p>
</form:form>
MODEL:
public class Obj{
@Length(max=50, message="Length invalid.")
private String field1;
// Getter and setter
}
控制器:
@SessionAttributes ({"obj"})
public class NavController{
@RequestMapping(value="show.do", method=RequestMethod.POST)
public ModelAndView submitUpdateObj(
HttpServletRequest request
, HttpServletResponse response
,@ModelAttribute
@Valid
Obj obj
,BindingResult result
) {
ModelAndView mav = new ModelAndView();
if(result.hasErrors()){
// clear bound value
obj.setField1("");
// add error messages to request
mav.setViewName("update");
}else{
mav.setViewName("register");
}
return mav;
}
}
我能够通过创建自定义Validator并在控制器中实例化/调用DataBinder来实现这一点,但我试图避免以编程方式验证此对象(没有嵌套的if / else逻辑)。看来,只要bean验证器拒绝某个字段,就无法清除它。您必须在拒绝之前清除该字段(这就是自定义验证器方法可行的原因)。使用上面的方法,验证/拒绝发生在我可以获取对象之前,我无法通过缓存的字段值。任何帮助将不胜感激。
*更新* 以下链接包含一个非常类似的问题:
http://forum.springsource.org/showthread.php?50762-Clear-form-field-after-failed-validation
提供的解决方案正是我不想做的。
答案 0 :(得分:0)
你忘了在模型和视图中设置obj。
添加此行
modelAndView.getModelMap().addAttribute("obj", obj);
在obj.setField1("");
之后
更具可读性:
@RequestMapping(value="show.do", method=RequestMethod.POST)
public ModelAndView submitUpdateObj(@ModelAttribute @Valid Obj obj,
BindingResult result) {
if(result.hasErrors()){
// clear bound value
obj.setField1("");
return new ModelAndView("update","obj",obj);
}else{
return new ModelAndView("register");
}
}
答案 1 :(得分:0)
刚遇到同样的问题,找不到合适的解决方案。 我遵循了以下解决方法:
Obj newObj = new Obj();
obj
newObj
复制到BeanUtils.copyProperties
newObj
设为ModelAndView
。你找到了更好的解决方案。