Springboot全局异常处理GlobalExceptionHandler
全局异常处理
自定义异常
在应用开发过程中,除系统自身的异常外,不同业务场景中用到的异常也不一样,为了与标题 轻松搞定全局异常 更加的贴切,定义个自己的异常,看看如何捕获…
package com.baizhi.exception;public class CustomException extends RuntimeException {private static final long serialVersionUID = 4564124491192825748L;private int code;public CustomException() {super();}public CustomException(int code, String message) {super(message);this.setCode(code);}public int getCode() {return code;}public void setCode(int code) {this.code = code;}
}
复制代码
异常信息模板
定义返回的异常信息的格式,这样异常信息风格更为统一
public class ErrorResponseEntity {private int code;private String message;// 省略 get set
}
复制代码
异常处理(关键)
注解概述
- @ControllerAdvice 捕获
Controller
层抛出的异常,如果添加@ResponseBody
返回信息则为JSON
格式。 - @RestControllerAdvice 相当于
@ControllerAdvice
与@ResponseBody
的结合体。 - @ExceptionHandler 统一处理一种类的异常,减少代码重复率,降低复杂度。
创建一个 GlobalExceptionHandler
类,并添加上 @RestControllerAdvice
注解就可以定义出异常通知类了,然后在定义的方法中添加上 @ExceptionHandler
即可实现异常的捕捉…
package com.baizhi.controller;
import com.baizhi.exception.CustomException;
import com.baizhi.exception.ErrorResponseEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {/*** 定义要捕获的异常 可以多个 @ExceptionHandler({})** @param request request* @param e exception* @param response response* @return 响应结果*/@ExceptionHandler(CustomException.class)public ErrorResponseEntity customExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) {response.setStatus(HttpStatus.BAD_REQUEST.value());CustomException exception = (CustomException) e;return new ErrorResponseEntity(exception.getCode(), exception.getMessage());}/*** 捕获 RuntimeException 异常* TODO 如果你觉得在一个 exceptionHandler 通过 if (e instanceof xxxException) 太麻烦* TODO 那么你还可以自己写多个不同的 exceptionHandler 处理不同异常** @param request request* @param e exception* @param response response* @return 响应结果*/@ExceptionHandler(RuntimeException.class)public ErrorResponseEntity runtimeExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) {response.setStatus(HttpStatus.BAD_REQUEST.value());RuntimeException exception = (RuntimeException) e;return new ErrorResponseEntity(400, exception.getMessage());}/*** 通用的接口映射异常处理方*/@Overrideprotected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers,HttpStatus status, WebRequest request) {if (ex instanceof MethodArgumentNotValidException) {MethodArgumentNotValidException exception = (MethodArgumentNotValidException) ex;return new ResponseEntity<>(new ErrorResponseEntity(status.value(), exception.getBindingResult().getAllErrors().get(0).getDefaultMessage()), status);}if (ex instanceof MethodArgumentTypeMismatchException) {MethodArgumentTypeMismatchException exception = (MethodArgumentTypeMismatchException) ex;logger.error("参数转换失败,方法:" + exception.getParameter().getMethod().getName() + ",参数:" + exception.getName()+ ",信息:" + exception.getLocalizedMessage());return new ResponseEntity<>(new ErrorResponseEntity(status.value(), "参数转换失败"), status);}return new ResponseEntity<>(new ErrorResponseEntity(status.value(), "参数转换失败"), status);}
}
复制代码
Springboot全局异常处理GlobalExceptionHandler相关推荐
- springboot全局异常处理_SpringBoot:如何优雅地处理全局异常
之前用springboot的时候,只知道捕获异常使用try{}catch,一个接口一个try{}catch,这也是大多数开发人员异常处理的常用方式,虽然屡试不爽,但会造成一个问题,就是一个Contro ...
- springboot 全局异常处理类
目录标题 springboot 全局异常处理类 依赖 代码 springboot 全局异常处理类 依赖 <!-- Spring Boot Web 依赖 核心 --><dependen ...
- SpringBoot 全局异常处理
下面首先来观察一个程序代码,例如:现在建立一个控制器,而后这个控制器自己抛出一个异常.@Controller public class MemberController extends Abstrac ...
- SpringBoot全局异常处理
1.为什么要全局异常处理 在实际开发中,如果不处理统一处理异常,那么前端在调用后端提供的接口,就会处理各种的异常结构,对于前端来说那可谓是一场灾难,这对前后端的协作也不友好.比如后端路径:/api/v ...
- [SpringBoot]全局异常处理
2019独角兽企业重金招聘Python工程师标准>>> 1. 全局异常处理 2. SpringBoot错误处理原理 3. SpringBoot定制错误页面 4. SpringBoot ...
- SpringBoot全局异常处理及前端请求参数校验
SpringBoot全局异常捕获处理及参数校验 文章目录 SpringBoot全局异常捕获处理及参数校验 为什么要用全局异常处理? 如何进行全局异常捕获和处理? 统一结果封装 统一返回结果 枚举类 使 ...
- springBoot 全局异常处理 报错 : Could not resolve method parameter at index 0 in public .....
在学习 springboot 的全局异常处理时 ,我写了一个处理异常类 @ControllerAdvice public class ErrorCatchController {@Exceptio ...
- springboot 全局异常处理 自定义mvc错误页面展示
如下:所有的异常都会进入到这里.根据个人业务按需处理 全局异常处理 @ControllerAdvice public class ErrorAdviceController {//指定捕获对象@Exc ...
- springboot全局异常处理详解
对于全局异常需要认识两个注解 @RestControllerAdvice,@ExceptionHandler 1. @RestControllerAdvice 组成:@ControllerAdvice ...
- springboot全局异常处理BasicErrorController和RestControllerAdvice
文章目录 RestControllerAdvice BasicErrorController ResponseBodyAdvice RestControllerAdvice @RestControll ...
最新文章
- vs连接mysql建一个表并增删查改_VS连接SQL Server数据库,增删改查详细教程(C#代码)...
- python线程的注意点(线程之间执行是无序的、主线程会等待所有的子线程执行结束再结束(守护主线程)、线程之间共享全局变量、线程之间共享全局变量数据出现错误问题(线程等待(join)、互斥锁))
- linux 运行多个docker,Docker 中如何连接多个 Container 协同工作
- Laravel表单提交419页面过期
- 怎么用python编程前二n-1项的等差数列的和_python 等差数列末项计算方式
- 【NOIP2013】【Luogu1980】计数问题
- win7做wifi服务器
- 使用.net开发手机管理软件 (九) 短信部分——PDU简介及其格式
- 在线教学战“疫”打响,VIPKID背后是阿里云
- 平面设计计算机基本配置,平面设计电脑配置要求
- 关键词组合工具_凭技术做外贸:关键词优化的高效工具推荐
- EffectiveJava3翻译 中英双语对照版
- 一款桌面整理软件——Fences
- python requests接收chunked编码问题
- 乐玩插件和大漠插件哪个好_2019年都用过哪些Chrome插件?分享30个好用的插件,提升上网体验...
- 2万字软件测试面试题干货带答案,反手我就一个收藏
- 红米note3 S线刷MUI版本,解决手机卡顿
- 免费简单的为域名申请SSL证书
- jzoj 4246【五校联考6day2】san
- ctrl+alt+t 函数注释快捷键失效KoroFileHeader
热门文章
- 实现简单的Java内存缓存
- 直击前沿技术:云原生应用低代码开发平台实践
- 10分钟就能搭建远程开发环境?你早点怎么不出现(#`n´)!
- 程序设计实践(评注版) 评注者序
- MYOP究竟能为站长提供哪些便利
- 5.4 tensorflow2实现消除多重共线性、人均网络消费回归分析——python实战
- Python如何从一个文件中调用另一个文件的类
- 【Leetcode】打家劫舍 I and 打家劫舍 II(动态规划)PYTHON
- lstm 做多分类loss完全不下降_使用Induction Network做Few-Shot Text分类
- python多线程学了多久_Python多线程一学就会!