概述
实际业务开发中,产生的错误信息,并不需要返回给用户,错误信息供开发人员排查错误即可,
对于用户而言,只需要抛出提示错误即可,这就需要对异常错误信息进行统一封装
返回统一信息定义可看上一篇文章:
[Java实现统一封装格式返回对象]
主要步骤如下:
1、自定义异常类
2、自定义拦截器异常处理
自定义异常类
public class BaseException extends RuntimeException {
private final IRetCode retCode;
protected Object[] args;
protected Object obj;
public BaseException(String message) {
super(message);
this.retCode = CommonRetEnum.FAIL;
}
public BaseException(IRetCode retCode) {
super(retCode.getMsg());
this.retCode = retCode;
}
public BaseException(IRetCode retCode, Throwable cause) {
super(cause);
this.retCode = retCode;
}
public BaseException(IRetCode responseEnum, Object obj) {
super(responseEnum.getMsg());
this.retCode = responseEnum;
this.obj = obj;
}
public BaseException(IRetCode responseEnum, Object obj, Object[] args) {
super(responseEnum.getMsg());
this.retCode = responseEnum;
this.obj = obj;
this.args = args;
}
public Throwable fillInStackTrace() {
return this;
}
public IRetCode getRetCode() {
return this.retCode;
}
public Object[] getArgs() {
return this.args;
}
public Object getObj() {
return this.obj;
}
public String toString() {
return "BaseException(retCode=" + this.getRetCode() + ", args=" + Arrays.deepToString(this.getArgs()) + ", obj=" + this.getObj() + ")";
}
}
自定义异常拦截类
@RestControllerAdvice
@Slf4j
public class GlobalExceptionAdvice {
@Autowired
private I18nMessageSource i18nMessageSource;
public GlobalExceptionAdvice() {
}
@ExceptionHandler({BaseException.class})
public RetObj handBaseException(BaseException e) {
IRetCode retCode = e.getRetCode();
String msg = e.getMessage();
Object obj = e.getObj();
Object[] args = e.getArgs();
if (StringUtil.isBlank(msg)) {
msg = retCode.getMsg();
}
return this.getBaseRet(retCode, args, obj, msg);
}
@ExceptionHandler({Exception.class})
public RetObj handleException(Exception e, HttpServletRequest request) {
return this.getSystemRet(request, CommonRetEnum.EXCEPTION, e);
}
private <T extends Throwable> RetObj getSystemRet(HttpServletRequest request, IRetCode retEnum, T ex) {
log.error("@@服务异常,Capture Exception By GlobalExceptionHandler: requestUrl: {} Code: {} Detail: {}", new Object[]{request.getRequestURL(), retEnum, ExceptionUtil.getStackTraceAsString(ex)});
String msg = this.getMessage(CommonRetEnum.EXCEPTION, (Object[]) null);
return RetObj.fail(CommonRetEnum.EXCEPTION, msg);
}
private RetObj getBaseRet(IRetCode retCode, Object[] args, Object obj, String errorMsg) {
String msg = this.getMessage(retCode, args);
if (StringUtil.isNotBlank(errorMsg)) {
msg = errorMsg;
}
return RetObj.fail(retCode.getCode(), msg, obj);
}
public String getMessage(IRetCode iRetCode, Object[] args) {
String code = "ret." + iRetCode.getCode() + "." + iRetCode.getMsg();
String message = this.i18nMessageSource.getMessage(code, args);
return StrUtil.isBlank(message) ? iRetCode.getMsg() : message;
}
}