【问题标题】:Can't clear form input after reject拒绝后无法清除表单输入
【发布时间】:2011-11-01 06:40:17
【问题描述】:

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

型号:

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 验证器拒绝一个字段,就没有办法清除它。您必须在字段被拒绝之前清除该字段(这就是自定义验证器方法起作用的原因)。使用上面的方法,验证/拒绝发生在我获得对象之前,我无法超过缓存的字段值。任何帮助将不胜感激。

* 更新 * 以下链接包含一个非常相似的问题:

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

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

【问题讨论】:

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


    【解决方案1】:

    你忘记在模型和视图中设置 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");
        }
    }
    

    【讨论】:

    • 两种方法都试过了,还是不行。我在前面的方法中将 obj 添加到 ModelAndView 中。它通过在类级别定义的 SessionAttributes 注释存储在会话中。
    【解决方案2】:

    刚遇到同样的问题,找不到合适的解决方案。 我遵循了以下解决方法:

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

    你有没有找到更好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-11
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 2018-03-14
      • 1970-01-01
      相关资源
      最近更新 更多