拒绝后无法清除表格输入

时间:2011-08-22 15:47:28

标签: java spring jsp spring-mvc bean-validation

在验证约束时,使用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

提供的解决方案正是我不想做的。

2 个答案:

答案 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();
  • 使用spring obj
  • 将所有属性从newObj复制到BeanUtils.copyProperties
  • newObj设为ModelAndView

你找到了更好的解决方案。