springboot配合Hibernate-Validator实现全局异常处理
Hibernate-Validator的使用方式不做介绍,注意接收配合使用的统一异常处理
异常处理方式
spring中的@ControllerAdvice定制优雅的返回信息
统一说明
当请求方式不对时,直接抛系统错误即可,不属于后续异常类
get 请求时校验异常处理
get请求进行jsr303校验时,返回的错误类是BindException.class,所以,在全局拦截器类,应该检测BindException类型的异常,进行特殊处理成返回信息。
/**
* 参数校验统一异常处理
*/
@ExceptionHandler(BindException.class)
@ResponseBody
public ResultDto handleBindException(BindException ex) {
FieldError fieldError = ex.getBindingResult().getFieldError();
log.error("参数校验异常:{}({})", fieldError.getDefaultMessage(),fieldError.getField());
ResultDto resultDto = new ResultDto();
resultDto.setCode(500);
resultDto.setData(null);
resultDto.setMessage(fieldError.getDefaultMessage());
return resultDto;
}
ResultDto为我自定义返回对象,请使用你们自己项目的返回对象。
post请求
post请求进行jsr303校验时,有两种情况,一种是没传body体,即body都没有;第二种则是参数错误;
第一种没传body体
该情况返回的是HttpMessageNotReadableException.class类型的错误,这种直接返回系统错误即可,个人感觉没必要做单独的处理
第二种参数错误
返回的错误类是MethodArgumentNotValidException.class,所以,在全局拦截器类,应该检测MethodArgumentNotValidException类型的异常,进行特殊处理成返回信息。
/**
* 参数校验统一异常处理
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public ResultDto handleBindException(MethodArgumentNotValidException ex) {
FieldError fieldError = ex.getBindingResult().getFieldError();
log.error("参数校验异常:{}({})", fieldError.getDefaultMessage(),fieldError.getField());
ResultDto resultDto = new ResultDto();
resultDto.setCode(500);
resultDto.setData(null);
resultDto.setMessage(fieldError.getDefaultMessage());
return resultDto;
}