我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况。Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异常内容。

默认情况下,Spring Boot为两种情况提供了不同的响应方式
1、当浏览器发送请求头是Accept: text/html;Spring Boot默认会响应一个html文档内容,称作“Whitelabel Error Page”。

2、当使用postman等调试工具发送请求一个不存在的url或服务端处理发生异常时,Spring Boot会返回类似如下的Json格式字符串信息。

{"timestamp": "2019-05-31T06:11:45.209+0000","status": 404,"error": "Not Found","message": "No message available","path": "/index.html"
}

Spring Boot 默认提供了程序出错的结果映射路径/error。这个/error请求会在BasicErrorController中处理,其内部是通过判断请求头中的Accept的内容是否为text/html来区分请求是来自客户端浏览器(浏览器通常默认自动发送请求头内容Accept:text/html)还是客户端接口的调用,以此来决定返回页面视图还是 JSON 消息内容。处理源码如下:

全局统一异常处理

Springboot中定义了默认的error错误映射,但是在实际项目使用中,这些默认的错误映射对我们来说并不实用,所以我们需要实现符合实际业务场景的异常提示。本文我们来学习springboot针对web应用的统一异常处理。

  • 局部异常处理 @Controller + @ExceptionHandler
  • 全局异常处理 @ControllerAdvice + @ExceptionHandler

1、局部异常处理 @Controller + @ExceptionHandler

局部异常主要用到的是@ExceptionHandler注解,此注解注解到类的方法上,当此注解里定义的异常抛出时,此方法会被执行。如果@ExceptionHandler所在的类是@Controller,则此方法只作用在此类。如果@ExceptionHandler所在的类带有@ControllerAdvice注解,则此方法会作用在全局。

2、全局异常处理 @ControllerAdvice + @ExceptionHandler

SpringBoot全局异常处理

SpringBoot中有一个ControllerAdvice的注解,使用该注解表示开启了全局异常的捕获,我们只需在自定义一个方法使用ExceptionHandler注解然后定义捕获异常的类型即可对这些捕获的异常进行统一的处理。

注意:基于@ControllerAdvice注解的全局异常统一处理只能针对于Controller层的异常,简单的说,进入Controller层的错误才会由@ControllerAdvice处理,拦截器抛出的错误以及访问错误地址的情况@ControllerAdvice处理不了,由SpringBoot默认的异常处理机制处理。

使用@ControllerAdvice或者@RestControllerAdvice定义统一的全局异常处理类,而不是在controller中逐个定义。使用@ExceptionHandler来定义函数针对的异常类型。

@RestControllerAdvice 类似于 @RestController 与 @Controller的区别

全局统一异常示例

上面说了springboot异常原理,在实际开发中,如果是要实现RESTful API,那么默认的JSON错误信息就不是我们想要的(本质上,只需在@ExceptionHandler之后加入@ResponseBody,就能让处理函数return的内容转换为JSON格式。),这时候就需要统一一下JSON格式,所以常常自己要封装一下。封装后的数据返回如下:

正确的时候

{code:200,msg:“获取列表成功”,data:{ queryList :[]}
}

错误的时候

{code:500,msg:“未知异常,请联系管理员”
}
import java.io.Serializable;/*** 自定义标准响应格式* @author: liumengbing* @date: 2019/05/31 16:35**/
public class ResponseModel implements Serializable {private Integer status;//响应状态码private String message;//响应信息private Object data;//响应内容public ResponseModel() {}public ResponseModel(Integer status, String message) {this.status = status;this.message = message;}public ResponseModel(Integer status, String message, Object data) {this.status = status;this.message = message;this.data = data;}//getter and setter …}
/*** 自定义异常,这里要继承runtimeException是因为spring框架对运行时异常会进行回滚,如果是exception就不会了* @author: liumengbing* @date: 2019/05/31 17:03**/
public class MyException extends RuntimeException {private int code;private Object data;public MyException() {}public MyException(int code, String message) {super(message);this.code = code;}public MyException(int code, String message, Object data) {super(message);this.code = code;this.data = data;}public int getCode() {return code;}public Object getData() {return data;}@Overridepublic String toString() {return "MyException{" +"code=" + code +", data=" + data +", message=" + getMessage() +'}';}
}
/*** 全局异常处理类* @author: liumengbing* @date: 2019/05/31 16:36**/
@ControllerAdvice
public class GlobalExceptionHandler {/*** 当发生Exception异常时,执行此方法* @param e* @return*/@ExceptionHandler(Exception.class)@ResponseBodypublic ResponseModel exHandler(Exception e) {// 判断发生异常的类型是除0异常则做出响应if (e instanceof ArithmeticException) {return new ResponseModel(500,"发生了除0异常");}// 未知的异常做出响应return new ResponseModel(500,"发生了未知异常");}/*** 当发生MyException异常时,执行此方法* @param myException* @return*/@ExceptionHandler(MyException.class)@ResponseBodypublic ResponseModel exHandler(MyException myException) {return new ResponseModel(500,"发生了MyException");}}

测试接口

 /*** @author: liumengbing* @date: 2019/05/31 16:35**/
@Controller
public class TestController {@RequestMapping("/test")@ResponseBodypublic String test() {throw new MyException();}
}

Springboot对web应用的统一异常处理相关推荐

  1. SpringBoot实战(十):统一异常处理

    强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan [前言] 处理好异常对系统有很好的保护作用同时会大大提高用户的体验,对异常统一处理是一个非常实用 ...

  2. Spring Boot中Web应用的统一异常处理

    为什么80%的码农都做不了架构师?>>>    我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况.Spring Boot提供了一个默认的映射:/error,当处理中抛 ...

  3. cannot be cast to org.springframework.web.method.HandlerMethod 统一异常处理发生异常。

    加入这个: <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandl ...

  4. log中文乱码 springboot_springboot + shiro 权限注解、统一异常处理、请求乱码解决

    springboot + shiro 权限注解.统一异常处理.请求乱码解决 前篇 后台权限管理系统 20200808新版本更新 版本升级及内容优化版本,改动内容: 版本更新,springboot从1. ...

  5. 优雅书写Controller(参数验证+统一异常处理)

    优雅书写Controller(参数验证+统一异常处理) 文章目录 最近开发了比较多的接口,因为没有可参考的案例,所以一开始一直按照我的理解进行开发.开发多了发现自己每个结果都写了相同的代码:try() ...

  6. 配置springboot在访问404时自定义返回结果以及统一异常处理

    在搭建项目框架的时候用的是springboot,想统一处理异常,但是发现404的错误总是捕捉不到,总是返回的是springBoot自带的错误结果信息. 如下是springBoot自带的错误结果信息: ...

  7. springboot(九)--统一异常处理(500)、错误页处理(404)

    如题,本篇我们介绍下springboot中统一异常500处理,以及错误页404处理. 一.统一异常处理(500) 主要针对于服务器出现500异常的情况,返回自定义的500页面到用户浏览器,或者输出错误 ...

  8. SpringBoot 2.x 统一异常处理

    1.统一异常处理类 package cn.hadron.controller; import org.springframework.web.bind.annotation.ControllerAdv ...

  9. springboot整合之统一异常处理

    特别说明:本次项目整合基于idea进行的,如果使用Eclipse可能操作会略有不同,不过总的来说不影响. springboot整合之如何选择版本及项目搭建 springboot整合之版本号统一管理  ...

最新文章

  1. CoreAnimation —— CATransaction(隐式动画)
  2. 程序设计基本概念(3)(sizeof)-2.20 2.23
  3. 对ESB概念的理解(转)
  4. LAMP(4)Apach和php结合、Apache默认虚拟主机
  5. dedeCMS如何进行关键词过滤替换和屏蔽非法词汇?
  6. 抢光儿童餐,是这届95后最后的倔强
  7. Android源码之路(一、IntentService)
  8. 124. PHP 性能分析
  9. STM32开发项目:步进电机驱动库
  10. Android如何关闭硬件加速
  11. 梦幻西游手游服务器维护公告,《梦幻西游手游》10月5日维护公告 部分区服合并...
  12. Python数据分析与挖掘——回归模型的假设检验
  13. 微软发布了个BT软件
  14. 【BUUCTF】[安洵杯 2019]吹着贝斯扫二维码
  15. Java中单引号和双引号的区别
  16. c语言一球从100米高度自由落下 每次落地返回,C语言编程 经典例题一百道 20 一球从100米的高度自由落下,每次落地返回原高度的一半再落下,求它在第10次落地,共经过多少米?第10反弹多高。...
  17. ApacheCamel简介
  18. 关于CSS动画@-webkit-keyframes的两种实现方式
  19. 机器学习4-x——音乐推荐系统代码实现
  20. 京东副总裁冯轶:京东超市将迎“人货场”全面升级

热门文章

  1. struts.preperties说明
  2. android RSA加密
  3. Android内存泄漏总结
  4. Java---形参个数可变的方法
  5. 前端开发流程与组件化
  6. BZOJ - 2744 朋友圈 (二分图上的最大团)
  7. 同时支持来自多个源头的域名的跨域调用
  8. 【VBA】查看窗口当前状态
  9. js中cookie的操作
  10. mesos资源动态分配测试