在Spring 3中验证错误后清除表单字段

问题描述 投票:3回答:2

是否(必须存在?)清除Spring 3中存在验证错误的表单域的方法?我知道清除“命令”对象属性是可行的……但前提是没有错误。当存在验证错误(FieldErrors或GlobalErrors)时,Spring会以某种方式重新填充字段。

forms spring validation field clear
2个回答
2
投票

因此,我找到了解决问题的方法。它工作得很好,但是对于像清除字段这样的简单操作来说似乎有点过大了。

也许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);
    }

确实非常简单?!??!?


0
投票

更干净的解决方案,七年后。礼貌https://stackoverflow.com/a/61609112/4618338

© www.soinside.com 2019 - 2024. All rights reserved.