1、全局异常枚举类和异常类
在 exception
包下创建业务异常枚举类和异常类
- 业务异常枚举类
public enum BusinessExceptionEnum {
MEMBER_MOBILE_EXIST("手机号已注册"),
MEMBER_MOBILE_NOT_EXIST("请先获取短信验证码"),
MEMBER_MOBILE_CODE_ERROR("短信验证码错误"),
CONFIRM_ORDER_SK_TOKEN_FAIL("当前操作频繁,请稍后重试");
private String desc;
BusinessExceptionEnum(String desc) {
this.desc = desc;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return "BusinessExceptionEnum{" +
"desc='" + desc + '\'' +
"} " + super.toString();
}
}
- 异常类
public class BusinessException extends RuntimeException {
private BusinessExceptionEnum e;
public BusinessException(BusinessExceptionEnum e) {
this.e = e;
}
public BusinessExceptionEnum getE() {
return e;
}
public void setE(BusinessExceptionEnum e) {
this.e = e;
}
/**
* 不写入堆栈信息,提高性能
*/
@Override
public Throwable fillInStackTrace() {
return this;
}
}
2、统一返回结果
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CommonResp<T> implements Serializable {
/**
* 业务上的成功或失败
*/
private boolean success = true;
/**
* 返回信息
*/
private String message;
/**
* 返回泛型数据,自定义类型
*/
private T content;
public CommonResp(T content) {
this.content = content;
}
}
3、统一业务异常处理
/**
* 统一异常处理、数据预处理等
*/
@ControllerAdvice
public class ControllerExceptionHandler {
private static final Logger LOG = LoggerFactory.getLogger(ControllerExceptionHandler.class);
/**
* 所有异常统一处理
*
* @param e
* @return
*/
@ExceptionHandler(value = Exception.class)
@ResponseBody
public CommonResp exceptionHandler(Exception e) throws Exception {
// LOG.info("seata全局事务ID:{}", RootContext.getXID());
// 如果是在一次全局事务里出异常了,就不要包装返回值,将异常抛给调用方,让事务方回滚事务
// if (StrUtil.isNotBlank(RootContext.getXID())) {
// throw e;
// }
CommonResp commonResp = new CommonResp();
LOG.error("系统异常:", e);
commonResp.setSuccess(false);
commonResp.setMessage("系统出现异常,请联系管理员");
return commonResp;
}
/**
* 业务异常统一处理
*
* @param e
* @return
*/
@ExceptionHandler(value = BusinessException.class)
@ResponseBody
public CommonResp exceptionHandler(BusinessException e) {
CommonResp commonResp = new CommonResp();
LOG.error("业务异常:{}", e.getE().getDesc());
commonResp.setSuccess(false);
commonResp.setMessage(e.getE().getDesc());
return commonResp;
}
/**
* 校验异常统一处理
*
* @param e
* @return
*/
@ExceptionHandler(value = BindException.class)
@ResponseBody
public CommonResp exceptionHandler(BindException e) {
CommonResp commonResp = new CommonResp();
LOG.error("校验异常:{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
commonResp.setSuccess(false);
commonResp.setMessage(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
return commonResp;
}
}