@Slf4j
@RestControllerAdvice(annotations = {RestController.class})
public class GlobalExceptionHandler {
@ExceptionHandler(AuthException.class)
public Result<?> authException(AuthException e) {
ResultCode rc = ResultCode.of(e.getCode());
return buildResult(rc == null ? ResultCode.AUTH_FAILED : rc, e);
}
@ExceptionHandler(BusinessException.class)
public Result<?> businessExceptionHandler(BusinessException e) {
return buildResult(e.getCode(), e.getMessage(), e);
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result<?> validationBodyException(MethodArgumentNotValidException e) {
BindingResult result = e.getBindingResult();
String err = result.getFieldError() == null ? null : result.getFieldError().getDefaultMessage();
if (StringUtils.isBlank(err)) {
err = "参数错误,请检查后重试";
}
return buildResult(ResultCode.PARAM_ERROR, err, e);
}
@ExceptionHandler(BindException.class)
public Result<?> handleBindException(BindException e) {
String err = e.getFieldError() == null ? null : e.getFieldError().getDefaultMessage();
if (StringUtils.isBlank(err)) {
err = "参数错误,请检查后重试";
}
return buildResult(ResultCode.PARAM_ERROR, err, e);
}
@ExceptionHandler(IllegalArgumentException.class)
public Result<?> handleBindException(IllegalArgumentException e) {
return buildResult(ResultCode.PARAM_ERROR, e.getMessage(), e);
}
@ExceptionHandler(HttpMessageConversionException.class)
public Result<?> parameterTypeException(HttpMessageConversionException e) {
return buildResult(ResultCode.PARAM_ERROR, e);
}
@ExceptionHandler(MissingServletRequestParameterException.class)
public Result<?> missingServletRequestParameterException(MissingServletRequestParameterException e) {
return buildResult(ResultCode.PARAM_ERROR, "缺少必传参数:" + e.getParameterName(), null);
}
@ExceptionHandler(UnsupportedOperationException.class)
public Result<?> unsupportedOperationException(UnsupportedOperationException e) {
return buildResult(ResultCode.NOT_SUPPORTED, e.getMessage(), e);
}
@ExceptionHandler(Exception.class)
public Result<?> runtimeException(Exception e) {
return buildResult(ResultCode.FAIL, e);
}
private static Result<?> buildResult(ResultCode code, Throwable e) {
return buildResult(code, null, e);
}
private static Result<?> buildResult(ResultCode code, String msg, Throwable e) {
String s = StringUtils.isBlank(msg) || "null".equalsIgnoreCase(msg) ? code.getDesc() : msg;
return buildResult(code.getCode(), s, e);
}
private static Result<?> buildResult(int code, String msg, Throwable e) {
String debugMsg = ExceptionUtils.getErrorMsg(e);
if (code == ResultCode.FAIL.getCode()) {
log.error("服务处理异常, code:{}, msg:{}", code, msg, e);
} else {
log.warn("请求失败, code:{}, msg:{}, err:{}, exceptionClass:{}", code, msg, debugMsg, e.getClass().getCanonicalName(), e);
}
return Result.fail(code, msg).setDebug(debugMsg);
}
}