2011-08-22 21 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

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