SpringBoot 项目中统一异常处理与信息返回
就是将前端请求返回的信息和异常封中在一个类中返回给前端。
步骤:
(1)创建SpringBoot项目:
(2)创建一个枚举类型:
package cn.js.Exception;
//这个枚举类中定义的都是跟业务有关的异常
public enum AppExceptionCodeMsg {
INVALID_CODE(10000,"验证码无效"),
USERNAME_NOT_EXISTS(10001,"用户名不存在"),
//也可以之定义其他异常信息
USER_CREDIT_NOT_ENOUTH(10002,"用户积分不足");
;
private int code ;
private String msg ;
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
AppExceptionCodeMsg(int code, String msg){
this.code = code;
this.msg = msg;
}
}
(3)创建自定义的异常类 :
package cn.js.Exception;
public class AppException extends RuntimeException{
private int code = 500;
private String msg = "服务器异常";
//业务出错 抛出异常都用这个
public AppException(AppExceptionCodeMsg appExceptionCodeMsg){
super();
this.code = appExceptionCodeMsg.getCode();
this.msg = appExceptionCodeMsg.getMsg();
}
//默认抛出异常500
public AppException(int code,String msg){
super();
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
(4)创建统一信息返回类 :
package cn.js.Exception;
public class Resp<T> {
//服务端返回的错误码
private int code = 200;
//服务端返回的错误信息
private String msg = "success";
//我们服务端返回给前端的数据
private T data;
private Resp(int code,String msg,T data){
this.code = code;
this.msg = msg;
this.data = data;
}
public static <T> Resp success(T data){
Resp resp = new Resp(200, "success", data);
return resp;
}
public static <T> Resp success(String msg,T data){
Resp resp = new Resp(200,msg, data);
return resp;
}
//抛出异常 返回错误信息
//AppExceptionCodeMsg:自己定义异常类
public static <T> Resp error(AppExceptionCodeMsg appExceptionCodeMsg){
Resp resp = new Resp(appExceptionCodeMsg.getCode(), appExceptionCodeMsg.getMsg(), null);
return resp;
}
public static <T> Resp error(int code,String msg){
Resp resp = new Resp(code,msg, null);
return resp;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
public T getData() {
return data;
}
}
(5)创建全局统一异常处理类:
package cn.js.Exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = {Exception.class})
@ResponseBody
public <T> Resp<T> exceptionHandler(Exception e){
//这里先判断拦截到的Exception是不是我们自定义的异常类型
if(e instanceof AppException){
AppException appException = (AppException)e;
return Resp.error(appException.getCode(),appException.getMsg());
}
//如果拦截的异常不是我们自定义的异常(例如:数据库主键冲突)
return Resp.error(500,"服务器端异常");
}
}
(6)创建一个controller 测试:
package cn.js.Controller;
import cn.js.Exception.AppException;
import cn.js.Exception.AppExceptionCodeMsg;
import cn.js.Exception.Resp;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.List;
@RestController
public class DemoController {
@GetMapping("demo")
public Resp<String> demo1(String name){
if("ok".equals(name)){
return Resp.success("succ");
}
if("err".equals(name)){
//抛业务相关的异常
throw new AppException(AppExceptionCodeMsg.USERNAME_NOT_EXISTS);
}
if("errcode".equals(name)){
throw new AppException(AppExceptionCodeMsg.INVALID_CODE);
}
if("0".equals(name)){
int i=1/0;
}
//检查用户积分是否足够,如果不够,就抛出异常
if("notenough".equals(name)){
throw new AppException(AppExceptionCodeMsg.USER_CREDIT_NOT_ENOUTH);
}
return Resp.success("default");
}
@GetMapping("list")
public Resp<List> list(){
List<String> list = Arrays.asList("zhangsan","lisi","wangwu");
return Resp.success(list);
}
}
*注意:
在类上面加了:@ControllerAdvice注解:
当类上面加了@ControllerAdvice注解时:当程序中出现了异常抛出了异常的时候,Spring就会拦截这个被抛出的异常。并调用自定义加了@ControllerAdvice注解的异常处理类中的exceptionHandler方法;
@ExceptionHandle(value={Exception.class}
加在方法上面:表示这个方法到时候要处理Exception类型的异常。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/188576.html