编辑:添加另一个解决方案
您可以拥有一个空模型对象,同时保留以前的错误,只需通过以下方式将新值(从新初始化的对象)复制到模型属性中即可:org.springframework.beans.BeanUtils
:
@RequestMapping(method = RequestMethod.POST)
public String post(@Valid @ModelAttribute("myForm") MyForm myForm, Errors errors, Model model) {
if (errors.hasErrors()) {
MyForm emptyForm = new MyForm();
BeanUtils.copyProperties(emptyForm, myForm);
return "my_form";
}
return "redirect:/confirmation";
}
这样,您仍然可以显示以前的错误,并且表单为空。
还有一个警告:如果我使用时工作正常<input>
字段,但不与<form:input>
spring 增强字段确实使用拒绝的值errors
.
如果您想继续使用<form:input>
字段,您将不得不创建另一个BindingResult
对象并用当前错误初始化它,只需将拒绝的值设置为 null。您甚至可以重置所有字段或仅重置错误字段:
@RequestMapping(value = "/form", method=RequestMethod.POST)
public String update(@Valid @ModelAttribute Form form, BindingResult result, Model model) {
if (result.hasErrors()) {
// uncomment line below to reset all fields - by default only offending ones are
//form = new Form();
BeanPropertyBindingResult result2 = new BeanPropertyBindingResult(form, result.getObjectName());
for(ObjectError error: result.getGlobalErrors()) {
result2.addError(error);
}
for (FieldError error: result.getFieldErrors()) {
result2.addError(new FieldError(error.getObjectName(), error.getField(), null, error.isBindingFailure(), error.getCodes(), error.getArguments(), error.getDefaultMessage()));
}
model.addAllAttributes(result2.getModel());
return "my_form";
}
return "redirect:/confirmation";
}