我有一个具有许多数据输入屏幕的应用程序,因此有许多控制器类接受各种形式的POST数据。表单使用javax验证批注,并且控制器正在使用BindingResult来检查错误。一些表单使用自定义验证器(实现Springs ValidationUtils)来进行更多验证。
我现在正在尝试使用@ControllerAdvice方法将表单验证(以删除每个控制器中重复的验证代码)集中到一个单独的类中,并从控制器方法的参数中删除BindingResult。删除Binding结果将引发ControllerAdvice类捕获的错误。
除了以下事实外,这一切都很好,除了在ControllerAdvice类的BindingResult中仅存在@ Max,@ Min之类的基本注释,而没有来自自定义验证器的更复杂的验证。
是否可以将自定义验证错误导入ControllerAdvice类?您还采取了哪些其他方法来集中表单验证处理?
谢谢!
下面的代码:
EmployeeController.java
@RequestMapping(value = "/save", method = RequestMethod.POST)
public @ResponseBody String save(@Valid @RequestBody EmployeeForm form,
HttpServletRequest request)
{
}
EmployeeFormValidator.java
@Component
public class EmployeeFormValidator implements Validator {
@Override
public boolean supports(Class clazz) {
return EmployeeFormValidator.class.equals(clazz);
}
@Override
public void validate(Object obj, Errors e)
{
EmployeeFormValidator form = (EmployeeFormValidator) obj;
e.reject("firstName", "Please populate the employee's first name field.");
}
}
ExceptionControllerAdvice.java
@ControllerAdvice
public class ExceptionControllerAdvice {
@ExceptionHandler(MethodArgumentNotValidException.class)
public @ResponseBody String handleException(MethodArgumentNotValidException ex, HttpServletRequest request) {
if(ex.getBindingResult() != null) {
BindingResult bindingResult = ex.getBindingResult();
return "Binding errors found.";
}else {
return "No binding errors found.";
}
}