2
是否存在(必須有?)一種方法來清除在Spring 3中有驗證錯誤的表單域?我知道,清除「命令」對象屬性工作...但只有在沒有錯誤。不知何故,當有驗證錯誤(FieldErrors或GlobalErrors)出現時,字段會被Spring重新填充。在Spring 3驗證錯誤後清除表單域
是否存在(必須有?)一種方法來清除在Spring 3中有驗證錯誤的表單域?我知道,清除「命令」對象屬性工作...但只有在沒有錯誤。不知何故,當有驗證錯誤(FieldErrors或GlobalErrors)出現時,字段會被Spring重新填充。在Spring 3驗證錯誤後清除表單域
所以我找到了解決問題的辦法。它工作得很好,但對清理一個領域這樣簡單的事情似乎有點矯枉過正。
也許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);
}
確實非常簡單???!?