SpringBoot中SpringMVC统一异常处理机制

更新时间:2023-05-16 08:20:43 阅读: 评论:0

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>rviceUnavailable(){
return new ResultInfo<T>(ResultCode.Code(), ResultCode.Message(), null); }
/**
* 服务器异常返回结果
* @param message 错误信息
望月台*/
public static<T> ResultInfo<T>rviceUnavailable(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);
}
public ApiException(ResultInfo resultInfo){
Message());
}
}
⼆、抛出异常
拦截器
/**
* 拦截器:验证⽤户是否登录
*/
public class UrLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletRespon respon, Object handler)throws Exception {        Object ur = Session().getAttribute("ur");
if(ur != null)return true;
throw new ApiException("请先登录");
}
}
业务层
业务层能判断的错误
1. ⼀般错误返回给业务层进⾏失败返回
2. 特殊异常则⽤⾃定义异常抛出,做⽇志记录!
注:异常处理代价较⼤!

本文发布于:2023-05-16 08:20:43,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/651736.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:返回   结果   失败
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图