全局异常的捕获
在spring的三层调用中不需要在处理异常只需要全部往上抛到controller层,由全局异常来进行统一捕获处理
如何定义全局异常
首先定义一个类在类上使用@RestControllerAdvice注解,AOP的思想
如何定义一个方法,方法上使用@ExceptionHandler注解
全局异常类
/**
* @author Administrator
*/
@RestControllerAdvice
public class GlobalException {
@ExceptionHandler
public ResponseBean globalException(Exception exception){
if (exception instanceof ServiceException) {
return ResponseBean.error(ErrorStatus.SERVICE_ERROR);
}
return ResponseBean.error();
}
}
工具类,响应数据的
package com.ssm.exception.utils;
import lombok.Data;
/**
* 响应成功或者失败状态类 该类应用于controller层,用于返回给前端响应状态,
* 这是一个工具类,里面封装了程序运行成功响应给前端的状态码和内容和程序运行失败响应给前端的状态码普遍方法
* 还有针对拥有特殊状态码的成功和失败的方法
* @author Administrator
* @param <T>
*/
@Data
public class ResponseBean <T>{
/**
* 响应给前端的状态码
*/
private int code;
/**
* 响应给前端的成功或者错误的内容
*/
private String message;
/**
* 返回给前端的查询结果集
*/
private T data;
/**
* 通用方法
* 程序运行成功响应给前端的数据
* @param data
* @param <T>
* @return
*/
public static <T> ResponseBean<T> success(T data) {
ResponseBean<T> responseBean = new ResponseBean<>();
responseBean.setCode(ErrorStatus.SUCCESS_RESPONSE.getStatus());
responseBean.setMessage(ErrorStatus.SUCCESS_RESPONSE.getMessage());
responseBean.setData(data);
return responseBean;
}
/**
* 通用方法
* 程序出现异常运行失败响应给前端的数据
* @param <T>
* @return
*/
public static <T> ResponseBean<T> error() {
ResponseBean<T> responseBean = new ResponseBean<>();
responseBean.setMessage(ErrorStatus.ERROR_RESPONSE.getMessage());
responseBean.setCode(ErrorStatus.ERROR_RESPONSE.getStatus());
return responseBean;
}
/**
* 特殊方法
* 针对程序运行成功时,拥有特殊状态码的响应
* @param status
* @param <T>
* @return
*/
public static <T> ResponseBean<T> error(ErrorStatus status) {
ResponseBean<T> responseBean = new ResponseBean<>();
responseBean.setCode(status.getStatus());
responseBean.setMessage(status.getMessage());
return responseBean;
}
/**
* 特殊方法
* 针对程序运行失败时,拥有特殊状态码的响应
* @param status
* @param data
* @param <T>
* @return
*/
public static <T> ResponseBean<T> success(ErrorStatus status, T data) {
ResponseBean<T> responseBean = new ResponseBean<>();
responseBean.setCode(status.getStatus());
responseBean.setMessage(status.getMessage());
responseBean.setData(data);
return responseBean;
}
}
枚举类,全局状态码处理
package com.ssm.exception.utils;
/**
* @author Administrator
*/
public enum ErrorStatus {
/**
* 枚举常量,参数根据构造方法来决定
*/
DAO_EXCEPTION(40000, "数据层异常"),
SUCCESS_RESPONSE(2000, "程序运行成功"),
ERROR_RESPONSE(40400, "程序运行失败"),
SERVICE_EXCEPTION(40001, "业务层异常"),
SERVICE_EXCEPTION2(40002, "用户不存在"),
SERVICE_EXCEPTION3(40003, "用户名或手机号码或邮箱已存在");
/**
* 响应状态码
*/
private int status;
/**
* 响应内容
*/
private String message;
/**
* 枚举类的全参构造方法
* @param status
* @param message
*/
ErrorStatus(int status, String message) {
this.status = status;
this.message = message;
}
/**
* getter和setter方法
* @return
*/
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
自定义异常类,可以自己定义异常,业务层或者数据层异常
package com.ssm.exception.custom.exception;
import com.ssm.exception.utils.ErrorStatus;
/**
* @author Administrator
*/
public class ServiceException extends Exception{
private int status;
private String message;
public ServiceException(int status, String message) {
this.status = status;
this.message = message;
}
public ServiceException(ErrorStatus status) {
this.status = status.getStatus();
this.message = status.getMessage();
}
}