是否(必须存在?)清除Spring 3中存在验证错误的表单域的方法?我知道清除“命令”对象属性是可行的……但前提是没有错误。当存在验证错误(FieldErrors或GlobalErrors)时,Spring会以某种方式重新填充字段。
因此,我找到了解决问题的方法。它工作得很好,但是对于像清除字段这样的简单操作来说似乎有点过大了。
也许JavaScript代码段是一种更干净的解决方案?
这里有足够的怨言是解决方案:如果字段中没有错误,请清除“命令”对象(表单支持对象)中的表单字段。
[出现验证错误时,Spring从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(); }
....然后继续像上面的方法一样使用Proxy重写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); }
确实非常简单?!??!?
更干净的解决方案,七年后。礼貌https://stackoverflow.com/a/61609112/4618338