SpringBoot中SpringMVC统⼀异常处理机制前置认识
1. 所有的异常都需要⽤controller返回给⽤户进⾏提⽰
2. SpringBoot有默认全局异常处理机制【BasicErrorController】
浏览器会返回项⽬下error /4xx.html【在request域中也会有以下json数据】;
⾮浏览器返回json:
{"timestamp":"2021-05-06T13:27:10.089+00:00",
"status":500,
"error":"Internal Server Error",
"trace":"java.lang.ArithmeticException: / by zero",
"message":"/ by zero",
"path":"/login.html"}
统⼀响应数据类型ResultInfo
现在,所有的响应都以json数据类型返回,后端controller不再参与页⾯转发、重定向等
所以我们需要构造⼀个统⼀的数据响应类型!
/**
* @Author: xiang
* @Date: 2021/5/6 22:59
*
* 通⽤返回对象
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ResultInfo<T>{
/**
* 状态码
*/
private long code;
/**
* 提⽰信息
*/
private String message;
/**
* 数据封装
*/
private T data;
/**
* 操作成功
*/
public static<T> ResultInfo<T>success(){
return new ResultInfo<T>(Code(), Message(), null);
}
/**
* 操作成功返回结果 (成功常常返回数据⽽不返回提⽰)
*
* @param data 获取的数据
*/
public static<T> ResultInfo<T>success(T data){
return new ResultInfo<T>(Code(), Message(), data);
}
/**
* 操作成功返回结果
*
* @param data 获取的数据
* @param data 获取的数据
* @param message 提⽰信息
*/
public static<T> ResultInfo<T>success(T data, String message){
return new ResultInfo<T>(Code(), message, data);
}
/**
* 操作失败
*/
public static<T> ResultInfo<T>failed(){
return new ResultInfo<T>(Code(), Message(), null);
}
/
**
* 操作失败返回结果 (失败常常返回错误信息⽽不返回数据)
* @param message 错误信息
*/
public static<T> ResultInfo<T>failed(String message){
return new ResultInfo<T>(Code(), message, null);
}
/**
* 操作失败返回结果
* @param data 返回的数据
* @param message 错误信息
*/
public static<T> ResultInfo<T>failed(T data, String message){
return new ResultInfo<T>(Code(), message, data);
}
/**
* 参数验证失败
*/
public static<T> ResultInfo<T>validateFailed(){
return new ResultInfo<T>(ResultCode.Code(), ResultCode.Message(), null); }
/**
* 参数验证失败返回结果
* @param message 错误信息
*/
public static<T> ResultInfo<T>validateFailed(String message){
return new ResultInfo<T>(ResultCode.Code(), message, null);
}
/**
* 未登录
*/
public static<T> ResultInfo<T>unauthorized(){
return new ResultInfo<T>(Code(), Message(), null);
}
/**
* 未登录返回结果
* @param message 错误信息
*/
public static<T> ResultInfo<T>unauthorized(String message){
return new ResultInfo<T>(Code(), message, null);
}
/**
* 访问权限不够
*/
public static<T> ResultInfo<T>forbidden(){
return new ResultInfo<T>(Code(), Message(), null);
}
/**
/**
* 访问权限不够返回结果
* @param message 错误信息
*/
public static<T> ResultInfo<T>forbidden(String message){
return new ResultInfo<T>(Code(), message, null);
}
/**
* 服务器异常
*/
public static<T> ResultInfo<T>serviceUnavailable(){
return new ResultInfo<T>(ResultCode.Code(), ResultCode.Message(), null); }
/**
* 服务器异常返回结果
* @param message 错误信息
*/
public static<T> ResultInfo<T>serviceUnavailable(String message){
return new ResultInfo<T>(ResultCode.Code(), message, null);
}
}
ResultInfo最常⽤的响应码单独列出到ResultCode
/**
* @Author: xiang
* @Date: 2021/5/6 22:55
*
* 枚举了⼀些常⽤API响应码(专门给ResultInfo⽤的)
* 这些枚举都是个⼤⽅向具体什么信息可以在ResultInfo⽅法中传⼊
*/
public enum ResultCode{
//成功直接返回⽤户
SUCCESS(200,"操作成功"),
/**
* 失败
*/
FAILED(500,"操作失败"),
VALIDATE_FAILED(404,"参数检验失败"),
UNAUTHORIZED(401,"暂未登录或token已经过期"),
FORBIDDEN(403,"没有相关权限"),
SERVICE_UNAVAILABLE(503,"服务器错误");
private long code;
private String message;
private ResultCode(long code, String message){
}
public long getCode(){
return code;
}
public String getMessage(){
return message;
}
}
统⼀的响应数据的基本使⽤
SpringBoot中的SpringMVC异常处理机制【正⽚开始】⼀、⾃定义异常
因为异常也要使⽤统⼀响应数据类型返回给⽤户,所以要有响应数据ResultInfo:
/**
* @Author: xiang
* @Date: 2021/5/11 23:28
* <p>
* API异常类(所有的SpringMVC错误都⽤此类抛出)
*/
@Data
public class ApiException extends RuntimeException {
//需要返回给⽤户的结果集
private ResultInfo resultInfo;
public ApiException(){
super();
resultInfo = ResultInfo.failed();
}
public ApiException(String message){
super(message);
resultInfo = ResultInfo.failed(message);
spring mvc和boot区别}
public ApiException(ResultInfo resultInfo){
Message());
}
}
⼆、抛出异常
/**
* :验证⽤户是否登录
*/
public class UserLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception { Object user = Session().getAttribute("user");
if(user != null)return true;
throw new ApiException("请先登录");
}
}
业务层
业务层能判断的错误
1. ⼀般错误返回给业务层进⾏失败返回
2. 特殊异常则⽤⾃定义异常抛出,做⽇志记录!
注:异常处理代价较⼤!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论