SpringBoot处理全局统一异常
在后端发生异常或者是请求出错时,前端通常显示如下
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback. Fri Jun :: CST
There was an unexpected error (type=Not Found, status=).
No message available
对于用户来说非常不友好。
本文主要讲解如何在SpringBoot应用中使用统一异常处理。
实现方式
第一种:使用@ControllerAdvice和@ExceptionHandler注解
第二种: 使用ErrorController类来实现。
第一种:使用@ControllerAdvice和@ExceptionHandler注解
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler { @ResponseBody
@ExceptionHandler(NullPointerException.class)
public BaseResult globalException(HttpServletResponse response,NullPointerException ex){ log.info("GlobalExceptionHandler...");
log.info("错误代码:" + response.getStatus());
BaseResult result = new WebResult(WebResult.RESULT_FAIL,"request error:"+response.getStatus()
,"GlobalExceptionHandler:"+ex.getMessage());
return result;
} }
注解@ControllerAdvice表示这是一个控制器增强类,当控制器发生异常且符合类中定义的拦截异常类,将会被拦截。
可以定义拦截的控制器所在的包路径
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice {
@AliasFor("basePackages")
String[] value() default {}; @AliasFor("value")
String[] basePackages() default {}; Class<?>[] basePackageClasses() default {}; Class<?>[] assignableTypes() default {}; Class<? extends Annotation>[] annotations() default {};
}
注解ExceptionHandler定义拦截的异常类
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExceptionHandler {
Class<? extends Throwable>[] value() default {};
}
第二种: 使用ErrorController类来实现。
系统默认的错误处理类为BasicErrorController,将会显示如上的错误页面。
这里编写一个自己的错误处理类,上面默认的处理类将不会起作用。
getErrorPath()返回的路径服务器将会重定向到该路径对应的处理类,本例中为error方法。
@Slf4j
@RestController
public class HttpErrorController implements ErrorController { private final static String ERROR_PATH = "/error"; @ResponseBody
@RequestMapping(path = ERROR_PATH )
public BaseResult error(HttpServletRequest request, HttpServletResponse response){
log.info("访问/error" + " 错误代码:" + response.getStatus());
BaseResult result = new WebResult(WebResult.RESULT_FAIL,"HttpErrorController error:"+response.getStatus());
return result;
}
@Override
public String getErrorPath() {
return ERROR_PATH;
}
}
测试
以上定义了一个统一的返回类BaseResult,方便前端进行处理。
package com.microblog.common.result; import java.io.Serializable; public class BaseResult implements Serializable { private static final long serialVersionUID = 1L; public static final int RESULT_FAIL = 0;
public static final int RESULT_SUCCESS = 1; //返回代码
private Integer code; //返回消息
private String message; //返回对象
private Object data; public BaseResult(Integer code, String message) {
this.code = code;
this.message = message;
} public BaseResult(Integer code, String message, Object object) {
this.code = code;
this.message = message;
this.data = object;
} public Integer getCode() {
return code;
} public void setCode(Integer code) {
this.code = code;
} public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
} public Object getData() {
return data;
} public void setData(Object data) {
this.data = data;
}
}
编写一个测试控制器
@Slf4j
@RestController
@RequestMapping("/user")
public class TestController { @RequestMapping("/info1")
public String test(){
log.info("/user/info1"); throw new NullPointerException("TestController have exception"); }
}
1.发出一个错误的请求,也就是没有对应的处理类。
从返回可以看到是由HttpErrorController类处理
{"code":0,"message":"HttpErrorController error:404","data":null}
2.发出一个正常的请求(TestController的test()处理),处理类中抛出空异样
从返回中可以看出是由GlobalExceptionHandler类处理
{"code":0,"message":"request error:200","data":"GlobalExceptionHandler:TestController have exception"}
区别
1.注解@ControllerAdvice方式只能处理控制器抛出的异常。此时请求已经进入控制器中。
2.类ErrorController方式可以处理所有的异常,包括未进入控制器的错误,比如404,401等错误
3.如果应用中两者共同存在,则@ControllerAdvice方式处理控制器抛出的异常,类ErrorController方式未进入控制器的异常。
4.@ControllerAdvice方式可以定义多个拦截方法,拦截不同的异常类,并且可以获取抛出的异常信息,自由度更大。
SpringBoot处理全局统一异常的更多相关文章
- springboot之全局处理异常封装
springboot之全局处理异常封装 简介 在项目中经常出现系统异常的情况,比如NullPointerException等等.如果默认未处理的情况下,springboot会响应默认的错误提示,这样对 ...
- Springboot项目全局异常统一处理
转自https://blog.csdn.net/hao_kkkkk/article/details/80538955 最近在做项目时需要对异常进行全局统一处理,主要是一些分类入库以及记录日志等,因为项 ...
- (办公)springboot配置全局异常
项目用到了springboot,本来很高兴,但是项目里什么东西都没有,验证,全局异常这些都需要自己区配置.最近springboot用的还是蛮多的,我还是做事情,把经验发表一下.全局统一的异常,首先异常 ...
- (转)springboot全局处理异常(@ControllerAdvice + @ExceptionHandler)
1.@ControllerAdvice 1.场景一 在构建RestFul的今天,我们一般会限定好返回数据的格式比如: { "code": 0, "data": ...
- 十四、springboot全局处理异常(@ControllerAdvice + @ExceptionHandler)
1.@ControllerAdvice 1.场景一 在构建RestFul的今天,我们一般会限定好返回数据的格式比如: { "code": 0, "data": ...
- SpringBoot | 第八章:统一异常、数据校验处理
前言 在web应用中,请求处理时,出现异常是非常常见的.所以当应用出现各类异常时,进行异常的捕获或者二次处理(比如sql异常正常是不能外抛)是非常必要的,比如在开发对外api服务时,约定了响应的参数格 ...
- springboot之全局处理统一返回
springboot之全局处理统一返回 简介 在REST风格的开发中,避免通常会告知前台返回是否成功以及状态码等信息.这里我们通常返回的时候做一次util的包装处理工作,如:Result类似的类,里面 ...
- 测试开发专题:spring-boot统一异常捕获
java异常介绍 异常时相对于return的一种退出机制,可以由系统触发,也可由程序通过throw语句触发,异常可以通过try/catch语句进行捕获并处理,如果没有捕获,则会导致程序退出并输出异常栈 ...
- spring boot 2 全局统一返回RESTful风格数据、统一异常处理
全局统一返回RESTful风格数据,主要是实现ResponseBodyAdvice接口的方法,对返回值在输出之前进行修改.使用注解@RestControllerAdvice拦截异常并统一处理. 开发环 ...
随机推荐
- Set学习笔记
今天又去看了一下STL里的set,来这里水一下博客 What is set? set的本质是一种功能受限的平衡树,不支持重复数字,也就是说如果插入一大堆数字12,输出它的长度还是1 如何定义 定义 s ...
- CDN惹的祸:记一次使用OSS设置跨域资源共享(CORS)不生效的问题
原文: https://www.lastupdate.net/4669.html 昨天H5组的开发反馈了一个问题,说浏览器收不到跨域的配置,提示:Failed to load https://nnmj ...
- 几句话总结一个算法之CTR预估模型
背景 假设现在有个商品点击预测的任务,有用户端特征性别.年龄.消费力等,商品侧特征价格.销量等,样本为0或者1,现在对特征进行one hot encode,如性别特征用二维表示,男为[1,0],女为[ ...
- JOI徽章
[题目描述] 日本信息学奥赛委员会为了应援将要去台湾参加 IOI 的选手们,打算制作一面新的 JOI 旗帜 .JOI 旗帜为由 M 行 N 列的 M*N 个正方形组 成的图形,每个正方形里写有 J,O ...
- linux 手动源码安装lnmp(亲测)
linux 手动源码安装lnmp笔记(亲测)<pre>先安装这2个yum install gccyum install g++</pre><pre>先在linux ...
- centos安装nginx1.17
从yum源安装nginx> yum install -y nginx> nginx -vnginx version: nginx/1.12.2 安装依赖包yum install -y gc ...
- python入门之模块
序什么是包包的作用一.什么是模块二.模块的三种来源三.模块的四种表现形式四.为什么要使用模块五. 如何创建,编写模块,并使用模块5.1 给模块起别名5.2 模块的导入方式5.3 循环导入问题 TOC ...
- Lab_1:练习2——使用qemu执行并调试lab1中的软件
一.实验内容 为了熟悉使用qemu和gdb进行的调试工作,我们进行如下的小练习: (一)从CPU加电后执行的第一条指令开始,单步跟踪BIOS的执行. (二)在初始化位置0x7c00设置实地址断点,测试 ...
- [转帖]String、StringBuilder与StringBuffer
String.StringBuilder与StringBuffer https://www.jianshu.com/p/37f3799bdb56 1.String String本质 String是不可 ...
- Aliyun发送短信接口调用方法
aliyun新版发送短信讲的不是很清晰,初次使用一堆dll不知道用哪个,以.net为例 申请SignName与Template_code请先申请,一般两个小时能通过 一.https://help.al ...