1. 先创建一个自定义异常类,继承 RuntimeException
/**
* 自定义异常,统一处理异常,便于解耦
* service与controller错误的解耦,不会被service返回的类型而限制
*/
public class MyCustomException extends RuntimeException {
/**
* 响应结果枚举类
*/
private ResponseStatusEnum responseStatusEnum;
public MyCustomException(ResponseStatusEnum responseStatusEnum) {
super("异常状态码为:" + responseStatusEnum.status()
+ ";异常信息:" + responseStatusEnum.msg());
this.responseStatusEnum = responseStatusEnum;
}
public ResponseStatusEnum getResponseStatusEnum() {
return responseStatusEnum;
}
public void setResponseStatusEnum(ResponseStatusEnum responseStatusEnum) {
this.responseStatusEnum = responseStatusEnum;
}
}
自定义异常类,继承 RuntimeException
然后添加一个响应结果枚举类参数 ResponseStatusEnum,实现get、set方法
ResponseStatusEnum 我会贴在文章后面
2. 创建一个统一封装处理异常类
/**
* 统一封装处理异常
*/
public class GraceException {
public static void display(ResponseStatusEnum responseStatusEnum) {
throw new MyCustomException(responseStatusEnum);
}
}
这个类也很简单,添加一个带参数的静态方法即可,这个参数就是响应结果枚举类 ResponseStatusEnum
主要功能就是将异常抛给我们上面创建的自定义异常类
3. 创建统一异常拦截处理类,使用 @ControllerAdvice + @ExceptionHandler 注解
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 统一异常拦截处理
* 可以针对异常的类型进行捕获,然后返回json信息到前端
*/
@ControllerAdvice
public class GraceExceptionHandler {
@ExceptionHandler(MyCustomException.class)
@ResponseBody
public GraceJsonResult returnMyException(MyCustomException e) {
e.printStackTrace();
return GraceJsonResult.exception(e.getResponseStatusEnum());
}
}
这里使用的是 @ControllerAdvice + @ExceptionHandler 注解的方式进行异常的拦截
GraceJsonResult 就是接口响应类,可以替换成自己项目中的,这个无所谓
GraceJsonResult类,仅供参考
public class GraceJsonResult {
/**
* 响应业务状态码
*/
private Integer status;
/**
* 响应消息
*/
private String msg;
/**
* 响应数据,可以是Object,也可以是List或Map等
*/
private Object data;
public static GraceJsonResult exception(ResponseStatusEnum responseStatus) {
return new GraceJsonResult(responseStatus);
}
}
响应结果枚举类 ResponseStatusEnum
public enum ResponseStatusEnum {
/**
* 成功或失败
*/
SUCCESS(200, true, "操作成功!"),
FAILED(500, false, "操作失败!"),
/**
* 50x
*/
UN_LOGIN(501, false, "请登录后再继续操作!"),
NO_AUTH(503, false, "您的权限不足,无法继续操作!"),
USER_NOT_EXIST_ERROR(516, false, "用户不存在!");
/**
* 响应业务状态
*/
private final Integer status;
/**
* 调用是否成功
*/
private final Boolean success;
/**
* 响应消息,可以为成功或者失败的消息
*/
private final String msg;
ResponseStatusEnum(Integer status, Boolean success, String msg) {
this.status = status;
this.success = success;
this.msg = msg;
}
public Integer status() {
return status;
}
public Boolean success() {
return success;
}
public String msg() {
return msg;
}
}
4. 使用方法,示例代码
private void checkUserExist(String username) {
User user = userService.queryUserByUsername(username);
if (user == null) {
GraceException.display(ResponseStatusEnum.USER_NOT_EXIST_ERROR);
}
}