一下四种方法本人比较推荐第三种
第一种在请求方法中自接处理
实体类
@Data
public class User {
@NotNull(message = "id不能为空")
private Integer id;
@NotBlank(message = "name不能为空")
private String name;
}
postman测试数据(id故意不传为空,让id验证不通过)
{
“name”:“lcc”
}
@PostMapping("/testValid")
public JSON testValid(@RequestBody @Validated User user,BindingResult bindingResult) {
if (bindingResult.hasErrors()){
StringBuffer errors = new StringBuffer();
bindingResult.getAllErrors().forEach(error ->{
errors.append(error.getDefaultMessage() + ";");
});
System.out.println(errors.toString());
}
return null;
}
第二种:针对当前controller做全局处理
@RestController
@RequestMapping("/lcc")
public class ExController {
@PostMapping("/testValid")
public JSON testValid(@RequestBody @Validated User user) {
return null;
}
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public JSON notValidExceptionHandle(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
if (bindingResult.hasErrors()){
StringBuffer errors = new StringBuffer();
bindingResult.getAllErrors().forEach(error ->{
errors.append(error.getDefaultMessage() + ";");
});
System.out.println(errors.toString());
}
return null;
}
}
此时当前controller中的所有数据校验异常都会被 @ExceptionHandler(MethodArgumentNotValidException.class)注解修斯的方法处理。即为当id字段为空,id校验不通过时testValid不在执行,回去执行notValidExceptionHandle
第三种:使用ControllerAdvice
@ControllerAdvice(assignableTypes = {ExController.class})
public class ExceptionAdvice {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public JSON notValidExceptionHandle(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
if (bindingResult.hasErrors()) {
StringBuffer errors = new StringBuffer();
bindingResult.getAllErrors().forEach(error -> {
errors.append(error.getDefaultMessage() + ";");
});
System.out.println(errors.toString());
}
return null;
}
}
被ControllerAdvice 修饰的类可以处理多种异常,只需要你在方法上用exception指定要处理的异常即可
@ControllerAdvice 中的assignableTypes属性用来指定处理哪些controller中的异常,如果不写,默认处理所有controller一定类型的异常。
第四种:定义全局异常处理器
@Component
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
Method method = null;
if (handler != null && handler instanceof HandlerMethod) {
method = ((HandlerMethod) handler).getMethod();
}
return new ModelAndView();
}
}