统一异常处理相关注解
@ControllerAdvice
: 声明在类上用于指定该类为控制增强器类,如果想声明返回的结果为RESTFull
风格的数据,需要在声明@ExceptionHandler
注解的方法上同时加上@ResponseBody
@RestControllerAdvice
: 声明在类上用于指定该类为控制增强器类。并声明返回的结果为RESTFull
风格的数据,无需在声明@ExceptionHandler
注解的方法上加@ResponseBody
@ExceptionHandler
: 声明在方法上用于指定需要统一拦截的异常。例如:@ExceptionHandler(value = Exception.class)
Controller
层的全局异常统一处理
@ControllerAdvice
public class MyControllerAdvice {
// 全局异常捕捉处理
@ResponseBody
@ExceptionHandler(value = Exception.class)
public Map errorHandler(Exception ex) {
Map map = new HashMap();
map.put("code", 100);
map.put("msg", ex.getMessage());
return map;
}
// 拦截捕捉自定义异常 MyException.class
@ResponseBody
@ExceptionHandler(value = MyException.class)
public Map myErrorHandler(MyException ex) {
Map map = new HashMap();
map.put("code", ex.getCode());
map.put("msg", ex.getMsg());
return map;
}
}
基于 @ControllerAdvice
注解的全局异常统一处理只能针对于 Controller
层的异常,意思是只能捕获到 Controller
层的异常,在 service
层或其他层面的异常是不能捕获的。有的时候,我们需要业务逻辑时抛出自定义异常,这个时候需要自定义业务异常类
自定义异常类捕捉 service
层或其他层面的异常
自定义异常类
public class BusinessException extends RuntimeException {
private Integer code;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public BusinessException(Integer code,String message) {
super(message);
this.code = code;
}
}
消息类
public class ReturnMessage<T> {
private Integer code;//错误码
private String message;//提示信息
private T data;//返回具体内容
public ReturnMessage(Integer code, String message, T data) {
super();
this.code = code;
this.message = message;
this.data= data;
}
// 省略get and set方法
}
消息类处理工具类
public class ReturnMessageUtil {
// 无异常 请求成功并有具体内容返回
public static ReturnMessage<Object> sucess(Object object) {
ReturnMessage<Object> message = new ReturnMessage<Object>(0,"sucess",object);
return message;
}
// 无异常 请求成功并无具体内容返回
public static ReturnMessage<Object> sucess() {
ReturnMessage<Object> message = new ReturnMessage<Object>(0,"sucess",null);
return message;
}
// 自定义错误异常信息
public static ReturnMessage<Object> error(Integer code,String msg) {
ReturnMessage<Object> message = new ReturnMessage<Object>(code,msg,null);
return message;
}
}
统一异常拦截类
@RestControllerAdvice
public class ExceptionHandle {
private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
@ExceptionHandler(value = Exception.class)
public ReturnMessage<Object> handle(Exception exception) {
if(exception instanceof BusinessException) {
BusinessException businessException = (BusinessException)exception;
return ReturnMessageUtil.error(businessException.getCode(), businessException.getMessage());
}else {
logger.error("系统异常 {}",exception);
return ReturnMessageUtil.error(-1, "未知异常"+ exception.getMessage());
}
}
}
service
层或其他层面抛异常
throw new BusinessException(100, "这个是自定义异常!")
此时,service
层或其他层面的异常就可以捕捉到了,返回给客户端 JSON
类型的异常数据