自定义全局异常
基础类
@Data
@NoArgsConstructor
public class Result {
//操作结果
private boolean success;
//返回编码
private Integer code;
//响应信息
private String message;
//返回结果中携带的数据
private Object data;
//只返回结果,不响应数据
public Result(ResultCode code) {
this.success = code.success;
this.code = code.code;
this.message = code.message;
}
//携带返回数据
public Result(ResultCode code, Object data) {
this.success = code.success;
this.code = code.code;
this.message = code.message;
this.data = data;
}
//在枚举类型中没有的情况下,自定义返回结果
public Result(Integer code, String message, boolean success) {
this.success = success;
this.code = code;
this.message = message;
}
public static Result SUCCESS() {
return new Result(ResultCode.SUCCESS);
}
public static Result ERROR() {
return new Result(ResultCode.SERVER_ERROR);
}
public static Result FAIL() {
return new Result(ResultCode.FAIL);
}
}
public enum ResultCode {
SUCCESS(true, 10000, "操作成功!"),
FAIL(false, 10001, "操作失败"),
UNAUTHENTICATED(false, 10002, "您还未登录"),
UNAUTHORISED(false, 10003, "权限不足"),
SERVER_ERROR(false, 99999, "抱歉,系统繁忙,请稍后再试!");
boolean success;
int code;
String message;
ResultCode(boolean success, int code, String message) {
this.success = success;
this.code = code;
this.message = message;
}
public boolean success() {
return success;
}
public int code() {
return code;
}
public String message() {
return message;
}
}
1、自定义自己的异常类型
@Getter //logback注解
public class CommonException extends Exception{
private ResultCode resultCode; //枚举类型自定义的响应编码
public CommonException(ResultCode resultCode) {
this.resultCode = resultCode;
}
}
2、自定义全局异常
@ControllerAdvice
public class BaseExceptionHandler {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result error(HttpServletRequest request, HttpServletResponse response, Exception e) {
if (e.getClass() == CommonException.class) {
CommonException ce = (CommonException) e;
return new Result(ce.getResultCode());
} else {
return new Result(ResultCode.SERVER_ERROR);
}
}
}
问题 | 解析 |
---|---|
@ControllerAdvice | @ControllerAdvice是基于aop的思想,有几种定义方式 1、若全部写则拦截所有的controller 2、若以@ControllerAdvice(basePackages=""/{"",""})拦截指定的包 3、若以@ControllerAdvice(annotations={注解类.class}) 拦截指定的注解 @ControllerAdvice用在三种场合 1、处理全局异常 @ExceptionHandler 2、预设全局数据 @ModelAttribute 3、请求参数预处理 @InitBinder |
@ExceptionHandler | 接收Throwable类作为参数,若参数为空则接住所有异常,若有参数,则处理发生参数类型错误的异常 |