2011-08-22 62 views
1

我无法清除使用Bean验证时约束被验证表单输入字段。我有一个表格输入可能不超过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; 
    } 

} 

我能够通过创建一个自定义的验证得到这个工作和在控制器中实例化/调用DataBinder,但我试图避免以编程方式验证此对象(不嵌套if/else逻辑)。看起来,只要bean验证器拒绝一个字段,就没有办法清除它。在拒绝之前,您必须先清除该字段(这是自定义验证程序方法将起作用的原因)。使用上面的方法,出现验证/拒绝之前,我可以得到目标的保持,我不能让过去的缓存字段值。任何帮助将不胜感激。

* UPDATE * 以下链接包含一个非常类似的问题:

http://forum.springsource.org/showthread.php?50762-Clear-form-field-after-failed-validation

提供的解决方案正是我宁愿不要做。

回答

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"); 
    } 
} 
+0

我试图左右逢源,它仍然无法正常工作。我在前面的方法中将obj添加到ModelAndView中。它通过在类级定义的SessionAttributes注释存储在会话中。 – javagruffian

+0

更新的问题。 – javagruffian

+0

如果您删除会话内容,它会工作吗? – Ralph

0

在同样的问题时只需来了,找不到妥善的解决办法。 我在解决方法下面执行了以下操作:

  • 创建一个新对象。在你的情况Obj newObj = new Obj();
  • 所有属性复制从objnewObj使用弹簧BeanUtils.copyProperties
  • 设置newObjModelAndView

你找到任何更好的解决方案。