【spring】-- springboot配置全局异常处理器
一、为什么要使用全局异常处理器?
什么是全局异常处理器?
就是把错误异常统一处理的方法。
应用场景:
1、当你使用jsr303参数校验器,如果参数校验不通过会抛异常,而且无法使用try-catch语句直接捕获,这时可以使用全局异常处理器来捕捉该异常。
2、当你自定义了一个异常类,可以在全局异常处理器中来捕捉该异常。(当然也可以直接在抛出异常处直接捕获,但是这样需要在每一个抛出的地方都写一次捕获代码,看起来不够美观且复用性不强,其他异常同理)。
所有异常都可以在全局异常处理器中捕获进行统一处理
二、具体使用步骤
1、定义统一的请求返回类型
public class Result<T> {
private int code;
private String msg;
private T data; /**
* 请求成功时调用
* @param data
* @return
*/
public static <T> Result<T> success(T data){
return new Result<T>(data);
} public static <T> Result<T> error(CodeMsg cm){
return new Result<T>(cm);
} /**
* 只传入数据默认成功,所以添加默认的code和msg
* @param data
*/
private Result(T data) {
this.code=0;
this.msg="success";
this.data=data;
} private Result(CodeMsg cm) {
if(cm==null){
return;
}
this.code=cm.getCode();
this.msg=cm.getMsg();
} public int getCode() {
return code;
} public String getMsg() {
return msg;
} public T getData() {
return data;
} }
public class CodeMsg { private int code;
private String msg; //通用的错误码
public static CodeMsg SUCCESS = new CodeMsg(0, "success");
public static CodeMsg SERVER_ERROR = new CodeMsg(500100, "服务端异常");
public static CodeMsg BIND_ERROR = new CodeMsg(500101, "参数校验异常:%s");
//登录模块 5002XX
public static CodeMsg SESSION_ERROR = new CodeMsg(500210, "Session不存在或者已经失效");
public static CodeMsg PASSWORD_EMPTY = new CodeMsg(500211, "登录密码不能为空");
public static CodeMsg STUDENTID_EMPTY = new CodeMsg(500212, "学号不能为空");
public static CodeMsg STUDENTID_ERROR = new CodeMsg(500213, "学号格式错误");
public static CodeMsg STUDENTIDE_NOT_EXIST = new CodeMsg(500214, "学号不存在");
public static CodeMsg PASSWORD_ERROR = new CodeMsg(500215, "密码错误"); public int getCode() {
return code;
} public String getMsg() {
return msg;
} public CodeMsg fillArgs(Object... args) {
int code = this.code;
String message = String.format(this.msg, args);
return new CodeMsg(code, message);
} private CodeMsg(int code,String msg) {
this.code = code;
this.msg = msg;
} }
2、定义自己的异常类
public class GlobalException extends RuntimeException{ private static final long serialVersionUID = 1L; private CodeMsg cm; public GlobalException(CodeMsg cm) {
super(cm.toString());
this.cm = cm;
} public CodeMsg getCm() {
return cm;
} }
3、定义全局异常处理器
@ControllerAdvice //该注解定义全局异常处理类
//@ControllerAdvice(basePackages ="com.example.demo.controller") 可指定包
@ResponseBody
public class GlobalExceptionHandler {
@ExceptionHandler(value=Exception.class) //该注解声明异常处理方法
public Result<String> exceptionHandler(HttpServletRequest request, Exception e){
e.printStackTrace();
//对于自定义异常的处理
if(e instanceof GlobalException) {
GlobalException ex = (GlobalException)e;
return Result.error(ex.getCm());
//对于绑定异常的处理,使用jsr303中的自定义注解抛出的异常属于绑定异常
}else if(e instanceof BindException) {
BindException ex = (BindException)e;
List<ObjectError> errors = ex.getAllErrors();
ObjectError error = errors.get(0);
String msg = error.getDefaultMessage();
return Result.error(CodeMsg.BIND_ERROR.fillArgs(msg));
}else {
return Result.error(CodeMsg.SERVER_ERROR);
}
}
}
4、使用自己的定义的异常类
if(user == null) {
throw new GlobalException(CodeMsg.STUDENTIDE_NOT_EXIST);
}
看到的更容易理解一篇文章:https://www.cnblogs.com/zs-notes/p/9366066.html
【spring】-- springboot配置全局异常处理器的更多相关文章
- Spring Boot 中全局异常处理器
Spring Boot 中全局异常处理器,就是把错误异常统一处理的方法.等价于Springmvc中的异常处理器. 步骤一:基于前面的springBoot入门小demo修改 步骤二:修改HelloCon ...
- Spring Boot配置全局异常捕获
1 SpringBoot配置全局的异常捕获 项目的说明 配置thymeleaf作为视图模板 ExceptionController.java模拟测试用 MyAjaxExceptionHandler.j ...
- 【学习】SpringBoot之全局异常处理器
/** * 全局异常处理器 **/ @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exceptio ...
- (办公)springboot配置全局异常
项目用到了springboot,本来很高兴,但是项目里什么东西都没有,验证,全局异常这些都需要自己区配置.最近springboot用的还是蛮多的,我还是做事情,把经验发表一下.全局统一的异常,首先异常 ...
- SpringBoot(6) SpringBoot配置全局异常
1.全局异常 @ControllerAdvice 如果是返回json数据 则用 RestControllerAdvice,就可以不加 @ResponseBody //捕获全局异常,处理所有不可知的异常 ...
- (入门SpringBoot)SpringBoot配置全局异常(五)
Spring的全局异常,用于捕获程序员没有捕获的异常.具体请看下面代码: 1.ControllerAdvice拦截异常,统一处理.通过Spring的AOP来管理. @ControllerAdvicep ...
- SSM之全局异常处理器
1. 异常处理思路 首先来看一下在springmvc中,异常处理的思路: 如上图所示,系统的dao.service.controller出现异常都通过throws Exception向上抛出,最后 ...
- spring设置全局异常处理器
1.spring设置全局异常,它的原理是向上捕获 spring.xml配置 <!--自定义全局异常处理器--> <bean id="globalExceptionResol ...
- SpringBoot项目中的全局异常处理器 Failed to invoke @ExceptionHandler method
文件下载代码 @RequestMapping(value = { "/data/docking/picture/{id}/{empi}" }) public JsonApi pic ...
随机推荐
- flask websocker
WebSocket 是一种网络通信协议.RFC6455 定义了它的通信标准. HTTP 协议是一种无状态的.无连接的.单向的应用层协议.它采用了请求/响应模型.通信请求只能由客户端发起,服务端对请求做 ...
- oldboy s21day15模块装饰器及其他应用
#!/usr/bin/env python# -*- coding:utf-8 -*- # 1.sys.path.append("/root/mods")的作用?"&qu ...
- 联网请求数据:Android篇
这篇文章主要回顾之前的MYangtzeu App教程的联网请求方法和json解析套路,主要目的是实现左侧菜单数据的联网获取. 1.先上请求地址实体类Constants.java package com ...
- Standford NLP study
Homepage https://stanfordnlp.github.io/CoreNLP/index.html Source Code: https://github.com/stanfordnl ...
- shell 脚本实现定时备份mysql数据库
首先要知道直接在脚本中输入mysql的密码是不被允许的,但是我们可以曲线救国 1. 在新建一个文件专门用来存储用户密码 如: vim ./.mysql.conf [mysqldump] user=yo ...
- I\O操作
作用:读写设备上数据.硬盘文件.内存.键盘.网络等. 分类: 数据走向:输入流.输出流 数据类型:字符流(文本数据Reader或者Writer结尾) 字节流(所有类型Stream结尾) 1个字节 = ...
- 记一次解决netty半包问题的经历
最近学习了netty,想写一个简单的rpc,结果发现发送消息时遇到难题了,网上搜了一下,这种情况是半包问题和粘包问题,主要是出现在并发高一些的时候. talk is cheap 客户端编码: prot ...
- python3三角函数
三角函数 acos(x) 返回x的反余弦弧度值. asin(x) 返回x的反正弦弧度值. atan(x) 返回x的反正切弧度值. atan2(y, x) 返回给定的 X 及 Y 坐标值的反正切 ...
- 移动端添加横向滚动条&隐藏
添加横向滚动条ul { display: flex; overflow-x: auto; overflow-y: hidden; white-space: nowrap; }隐藏滚动条,保留滚动效果 ...
- python+selenium自动测试之WebDriver的常用API(基础篇二)
本篇介绍一下python+selenium复杂操作的处理,基于python3.6,selenium3.141,详细资料介绍查看官方API文档,点击这里 一.常见特殊情况处理如iframe/弹窗处理 有 ...