2013-05-30 25 views
2

是否存在(必須有?)一種方法來清除在Spring 3中有驗證錯誤的表單域?我知道,清除「命令」對象屬性工作...但只有在沒有錯誤。不知何故,當有驗證錯誤(FieldErrors或GlobalErrors)出現時,字段會被Spring重新填充。在Spring 3驗證錯誤後清除表單域

回答

1

所以我找到了解決問題的辦法。它工作得很好,但對清理一個領域這樣簡單的事情似乎有點矯枉過正。

也許JavaScript片段是一個更清潔的解決方案?

這樣做的好處是解決方案: 當字段中沒有錯誤時清除「命令」對象(表單支持對象)中的表單字段。

當有驗證錯誤春拿起從BindingResult對象中的值「rejectedValuse」所以 做出的BindingResult的「代理」,返回「」的時候,這個getFieldValue(String s)將函數被調用.. 做一個「你說什麼」? ...代理。就像這樣:

public class BindingResultProxy implements BindingResult { 
final private BindingResult proxied; 
final private Set<String> fieldsToClearValueFor; 

public BindingResultProxy(BindingResult proxied) { 
    this.proxied = proxied; 
    fieldsToClearValueFor = new TreeSet<String>(); 
} 

public void clearFieldValueFor(String fieldname) { 
    fieldsToClearValueFor.add(fieldname); 
} 

@Override 
public Object getTarget() { 
    return proxied.getTarget(); 
} 

@Override 
public Map<String, Object> getModel() { 
    return proxied.getModel(); 
} 

....它那張覆蓋BindingResults所有的方法使用代理像上述方法 ..然後在getFieldValue()返回「」上,當某種機制決定。(列表)你明白了嗎? :-)

 @Override 
     public Object getFieldValue(String s) { 
      if (fieldsToClearValueFor.contains(s)) return ""; 
      return proxied.getFieldValue(s); 
     } 
控制器使用

然後:

if(result.hasErrors()){ 
     //If there are errors, clear the fields 
     ArrayList<String> fieldsToClear = new ArrayList<String>(3); 
     for(FieldError fieldError: result.getFieldErrors()) { 
      fieldsToClear.add(fieldError.getField()); 
     } 
     if(result.hasGlobalErrors()){ 
      //there is only one global error here in case the new password does not match the confirm password 
      //so clear the confirmPassword as well 
      fieldsToClear.add("confirmPassword"); 
     } 

     clearFormFieldValues(result, model, fieldsToClear.toArray(new String[fieldsToClear.size()])); 
return "/account/changePassword"; 

.....

private void clearFormFieldValues(BindingResult result, Model model, String... fieldsToClear) { 
     final BindingResultProxy configuredBindingResult = new BindingResultProxy(result); 
     for (String fieldToClear : fieldsToClear) { 
      configuredBindingResult.clearFieldValueFor(fieldToClear); 
     } 
       model.addAttribute("org.springframework.validation.BindingResult.changePasswordForm", 
configuredBindingResult); 
    } 

確實非常簡單???!?