在java中如果出现异常的话,往往文案不是很友好,不能直观的看出是什么问题导致的,我们可以在一个服务里自定义全局异常拦截类,对某些特定的异常或者自定义的异常做拦截,然后返回合适的文案,让用户一看便知道问题出在哪,不多说直接上代码:
package name.controller为controller所在的包目录,
@Slf4j
@RestControllerAdvice("***package name***.controller")
public class ExceptionAdvice {
/**
* 参数校验绑定异常
* 参数校验主要是这个异常
*/
@ExceptionHandler(BindException.class)
public Response handle(BindException ex) {
List<FieldError> fieldErrorList = ex.getBindingResult().getFieldErrors();
List<String> errorMsgList = fieldErrorList.stream()
.map(fieldError -> fieldError.getField() + ": " + fieldError.getDefaultMessage())
.collect(Collectors.toList());
return Response.fail(
BIND_EXCEPTION_ERROR.getCode(),
BIND_EXCEPTION_ERROR.getMsg()
);
}
/**
* 方法参数不匹配异常
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public Response handle(MethodArgumentNotValidException ex) {
log.info("Happen MethodArgumentNotValidException,ex={},detail={}", ex.getMessage(), ex);
List<FieldError> fieldErrorList = ex.getBindingResult().getFieldErrors();
List<String> errorMsgList = fieldErrorList.stream()
.map(fieldError -> fieldError.getField() + ": " + fieldError.getDefaultMessage())
.collect(Collectors.toList());
return Response.fail(
INVALID_EXCEPTION_ERROR.getCode(),
INVALID_EXCEPTION_ERROR.getMsg()
);
}
/**
* 兜底的异常
*/
@ExceptionHandler(Exception.class)
public Response runtimeException(Exception e) {
log.info("Happen Global Exception,e={},detail={}", e.getMessage(), e);
//todo 记录日志,并给出友好提示
return Response.fail("系统异常!请稍后重试!");
}
}
@RestControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中,主要配合@ExceptionHandler使用,统一处理异常情况。上面的Response都是项目自定义的返回对象。