Spring Boot异常处理

news2024/11/26 7:30:47

目录

Spring Boot异常处理

介绍

 拦截器VS 过滤器

自定义异常页面

 自定义异常页面

代码实战

需求

代码实现

 创建MyErrorController类来模拟异常错误

 完成测试

全局异常

说明

全局异常-应用实例

创建GlobalExceptionHandler.java

创建对应的视图地址global.html

完成测试

 自定义异常

说明

应用实例

创建AccessException.java

修改MyErrorController.java

完成测试


Spring Boot异常处理

介绍

1. 默认情况下,Spring Boot 提供/error 处理所有错误的映射
2. 对于机器客户端,它将生成JSON 响应,其中包含错误,HTTP 状态和异常消息的详细信息。对于浏览器客户端,响应一个"whitelabel"错误视图,以HTML 格式呈现相同的数据


 拦截器VS 过滤器

1、使用范围不同
1) 过滤器实现的是javax.servlet.Filter 接口,而这个接口是在Servlet 规范中定义的,也就是说过滤器Filter 的使用要依赖于Tomcat 等容器,Filter 只能在web 程序中使用

2) 拦截器(Interceptor) 它是一个Spring 组件,并由Spring 容器管理,并不依赖Tomcat 等容器,是可以单独使用的。不仅能应用在web 程序中,也可以用于Application 等程序中

2、过滤器和拦截器的触发时机也不同,看下边这张图

 1) 过滤器Filter 是在请求进入容器后, 但在进入servlet 之前进行预处理, 请求结束是在servlet 处理完以后

2) 拦截器Interceptor 是在请求进入servlet 后, 在进入Controller 之前进行预处理的,Controller 中渲染了对应的视图之后请求结束

不理解的 请javaweb filter , 和springmvc 的interceptor 和springmvc 的执行流程的博客在我的专栏里面有

3、说明: 过滤器不会处理请求转发, 拦截器会处理请求转发

4、至于过滤器和拦截器的原理和机制, 已经在博客详细讲解过了, 过滤器在JavaWeb , 拦
截器在SpringMVC 讲过, 忘了在我的专栏里面有


自定义异常页面

文档:
https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.develo
ping-web-applications.spring-mvc.error-handling.error-pages
 

自定义异常页面说明
1、如何找到这个文档位置, 看下面一步步的指引
 https://docs.spring.io/spring-boot/docs/current/reference/html/index.html

说明 先点击上面的链接 打开文档 然后按下面的步骤一步一步的来 最后到截图位置

  1. a single pagehtml 
  2. 8.web
  3. servlet web application
  4. The "Spring Web MVC Framework"
  5. Error Handling 
  6. Custom Error Pages

 自定义异常页面

代码实战

需求

 自定义404.html 500.html 4xx.html 5xx.html 当发生相应错误时,显示自定义的页面信息

代码实现

创建4 个页面, 这几个页面拷贝即可 

 创建MyErrorController类来模拟异常错误

@Controller
public class MyErrorController {

    //模拟一个服务器内部错误500
    @GetMapping("/err")
    public String err() {
        int i = 10 / 0; //算术异常
        return "manage";
    }

    //这里我们配置的是Post方式请求 /err2
    @PostMapping("/err2")
    public String err2() {
        //..
        return "manage";
    }
}

 完成测试

● 需要先登录,再进行测试,否则会被拦截器打回登录页面

● 对于/err2 , 使用get 方式去请求,就会生成400 错误, 可以看到4xx.html

因为这个页面在上一篇博客已经完成了这里在展示就太繁杂了 这篇主要演示异常的原理和机制 有兴趣可以去看 链接

测试链接

http://localhost:8080/xx
http://localhost:8080/err2

http://localhost:8080/err


全局异常

说明

1. @ControllerAdvice+@ExceptionHandler 处理全局异常
2. 底层是ExceptionHandlerExceptionResolver 支持的
 

全局异常-应用实例

 需求: 演示全局异常使用, 当发生ArithmeticException、NullPointerException 时

不使用默认异常机制匹配的xxx.html , 而是显示全局异常机制指定的错误页面

创建GlobalExceptionHandler.java

1、编写方法,处理指定异常, 比如我们处理算术异常和空指针异常, 可以指定多个异常

2. 这里要处理的异常,由程序员来指定

3. Exception e : 表示异常发生后,传递的异常对象

4. Model model: 可以将我们的异常信息,放入model,并传递给显示页面

5.如何获取到异常发生的方法

6.@Slf4j 这个注解的作用是显示日志 方便程序员查看

/**
 * @ControllerAdvice: 使用它可以标识一个全局异常处理器/对象
 * 会注入到spring容器
 */
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {

    //1、编写方法,处理指定异常, 比如我们处理算术异常和空指针异常, 可以指定多个异常
    //2. 这里要处理的异常,由程序员来指定
    //3. Exception e : 表示异常发生后,传递的异常对象
    //4. Model model: 可以将我们的异常信息,放入model,并传递给显示页面
    //5.如何获取到异常发生的方法

    @ExceptionHandler({ArithmeticException.class, NullPointerException.class,AccessException.class})
    public String handleAritException(Exception e, Model model, HandlerMethod handlerMethod) {

        log.info("异常信息={}", e.getMessage());
        //这里将发生的异常信息放入到model,可以再错误页面取出显示
        model.addAttribute("msg", e.getMessage());
        //得到异常发生的方法是哪个
        log.info("异常发生的方法是={}", handlerMethod.getMethod());
        return "/error/global"; //视图地址
    }
}

创建对应的视图地址global.html

注意这个html页面要在静态资源下的erro文件不然无法识别

templates 是使用Thymeleaf解析指定的文件

只要静态资源放在类路径下: /static 、/public 、/resources 、/META-INF/resources可以被直接访问- 对应文件 这个如果不知道可以看一下 (6条消息) Spring boot之WEB 开发-静态资源访问---Rest 风格请求处理--接收参数相关注解--复杂参数--自定义对象参数-自动封装--自定义转换器--处理JSON-- 内容协商_尘觉的博客-CSDN博客

<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>全局异常-显示页面</title>
</head>
<body bgcolor="#CED3FE">
<img src="images/1.GIF"/>
<hr/>
<div style="text-align: center">
    <h1>全局异常/错误 发生了:)</h1><br/>
    异常/错误信息: <h1 th:text="${msg}"></h1><br/>
    <a href='#' th:href="@{/}">返回主页面</a>
</div>
<hr/>
<img src="images/logo.png"/>
</body>
</html>

完成测试

浏览器http://localhost:8080/err

 


 自定义异常

说明

1. 如果Spring Boot 提供的异常不能满足开发需求,程序员也可以自定义异常.

2. @ResponseStatus+自定义异常

3. 底层是ResponseStatusExceptionResolver

底层调用response.sendError(statusCode,resolvedReason);

4. 当抛出自定义异常后,仍然会根据状态码,去匹配使用x.html 显示..

应用实例

需求:自定义一个异常AccessException, 当用户访问某个无权访问的路径时,抛出该异常,显示
自定义异常状态码..

创建AccessException.java

/**
 * AccessException : 我们自定义的一个异常
 * 关于自定义异常, 我们在java基础中的博客忘记了的小伙伴可以去看看在专栏EE
 * value = HttpStatus.FORBIDDEN: 表示发生AccessException异常,我们通过http协议返回的状态码 403
 * 这个状态码和自定义异常的对应关系是由程序员来决定[尽量合理来设置]
 */
@ResponseStatus(value = HttpStatus.FORBIDDEN)
public class AccessException extends RuntimeException {

    //提供一个构造器,可以指定信息
    public AccessException(String message) {
        super(message);
    }

    //显示的定义一下无参构造器

    public AccessException() {
    }
}

修改MyErrorController.java

    //编写方法,模拟一个AccessException
    @GetMapping("/err3")
    public String err3(String name) {
        //如果用户不是tom,我们就认为,无权访问-模拟
        if(!"tom".equals(name)) {
            //throw new AccessException();
            throw new AccessException("老韩自定义的AccessException..");
        }
        return "manage";//视图地址, 请求转发
        //return "redirect:/manage.html";
    }

完成测试

浏览器http://localhost:8080/err3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/538843.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker的使用 (1.什么是docker)

前言 这个系列是我自己学习使用docker的记录和分享&#xff0c;作为一名开发人员&#xff0c;你需要了解这个东西并且学会它的简单使用&#xff0c;但是作为一名开发而不是运维&#xff0c;不要花过多的时间去深究它的原理&#xff0c;而是把它当作一个工具即可 docker Docke…

新的RA Group勒索软件针对美国组织进行双重勒索攻击

一个名为“RA Group”的新勒索软件组织针对美国和韩国的制药、保险、财富管理和制造公司。 新的勒索软件行动始于 2023 年 4 月&#xff0c;当时他们在暗网上启动了一个数据泄露站点&#xff0c;以发布受害者的详细信息和被盗数据&#xff0c;采用了大多数勒索软件团伙使用的典…

1.2 Kubernetes架构组件

1.2 Kubernetes架构组件 学习Kubernetes的架构组件&#xff0c;也就是说我们要搭建一个Kubernetes集群里面应该有哪些组成部分&#xff0c;里面具体会有哪些组件。如图 组建一个Kubernetes的集群至少需要包含两个部分&#xff0c;即Master和node&#xff0c;Master即主控节点&…

5月16日|5月17日 6H|时间轴复盘

目录 5月16日 5月17日 5月16日 7:50 起床 7:50-8:25 洗漱到教室吃饭🥚🥚🥛 8:25-8:55 扇贝单词*105 【30min】 8:55- 20:10-21:04 做阅读真题 21:04-21:49 订正答案 糟糕的一天 记忆完全失踪 🆘 5月17日 7:00 起床 7:00-7:30 起床洗漱到教室 7:30-8:00…

1.3 Kubernetes核心概念

1.3 Kubernetes核心概念 在Kubernetes中有三个核心的概念&#xff0c;即Pod、Controller、Service。整个过程可以理解为通过Service统一入口进行访问&#xff0c;由Controller去创建Pod进行部署。 1.3.1 Pod Pod是在Kubernetes中最小的部署单元&#xff0c;如图 Pod的特点 …

免费可用 ChatGPT 网页版

前言 ChatGPT&#xff08;全名&#xff1a;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;美国OpenAI 研发的聊天机器人程序 &#xff0c;于2022年11月30日发布 。ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过理解和学习人类的语言来…

2.5 Java开发环境搭建

2.5 Java开发环境搭建 一、JDK下载与安装 我们主要下载安装JDK8&#xff0c;有些人认为现在已经更新到了JDK12以及更高的版本&#xff0c;无论JDK12、13还是更高的版本&#xff0c;在企业中用的并不是很多&#xff0c;而且每次更新只是增加了一些新特性&#xff0c;我们只需要…

PDF大文件批量去除水印,又一个省心小妙招

PDF大文件批量去除水印&#xff0c;又一个省心小妙招 适用场景&#xff1a;本教程适合批量去除文件量较大的PDF文档内的图片水印。 使用软件&#xff1a;Python&#xff1b; 需安装第三方库&#xff1a;PIL&#xff0c;fitz&#xff0c;pymupdf pip install PIL pip install…

Robot Framework+Jenkins持续集成UI自动化项目

使用Robot Framework框架可进行Web端和APP端的UI自动化测试&#xff0c;为方便定时执行&#xff0c;可将Robot Framework的自动化项目持续集成至Jenkins平台&#xff0c;具体的操作步骤如下&#xff1a; 安装Jenkins的步骤如下&#xff1a; 手把手教小白安装Jenkins_程序员馨馨…

关于对【java中的Lambda表达式】的理解与简述

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/130522535 出自【进步*于辰的博客】 坦白说&#xff0c;在我学会如何使用Lambda表达式后&#x…

机器学习笔记:高斯混合模型 GMM

1 高斯混合模型 总体分布是由K个高斯分布的组成的混合分布 1.1 一些记号 xj第j个观测数据K模型中高斯模型的数量αk 观测数据属于第k个子模型的概率 第k个子模型的高斯分布密度函数 &#xff08;也就是一个高斯分布的密度函数 第j个观测数据属于第k个子模型的概率 1.2 高斯…

Windows环境下安装Redis

下载地址&#xff1a; Releases microsoftarchive/redis GitHub Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择&#xff0c;这里我们下载 Redis-x64-xxx.zip压缩包到 D 盘redis文件夹下。 网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.co…

web应用安全漏洞

注入类 数据库注入 SQL注入 结构化查询语言 (Structured Query Language)简称SQL&#xff0c;结构化查询语言是一种数 据库查询和程序设计语言&#xff0c;用于存取数据以及查询、更新和管理关系数据库系统 关系型数据库 &#xff0c;是指采用了关系模型来组织数据的数据库&…

STM32(一)准备开发环境CLion+CubeMX

本篇内容 一、CLion和STM32CubeMX基础安装二、安装OpenOCD三、安装交叉编译工具链四、配置CLion并点亮第一个LED灯五、烧录程序六、错误排查 本篇安装配置STM32的开发环境&#xff0c;使用的是稚晖君同款CLionSTM32CubeMX的开发环境 一、CLion和STM32CubeMX基础安装 软件安装只…

Java-API简析_java.lang.Integer类(基于JDK1.8)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/130730986 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…

Python绘制带误差棒的柱状图渐变色填充含数据标注(进阶)

往期python绘图合集: python绘制简单的折线图 python读取excel中数据并绘制多子图多组图在一张画布上 python绘制带误差棒的柱状图 python绘制多子图并单独显示 python读取excel数据并绘制多y轴图像 python绘制柱状图并美化|不同颜色填充柱子 文章目录 准备数据一、绘制图表二、…

Android RecyclerView实现吸顶动态效果,附详细效果图

文章目录 一、ItemDecoration二、实现RecyclerView吸顶效果1、实现一个简单的RecyclerView2、通过ItemDecoration画分割线3、画出每个分组的组名4、实现吸顶效果 完整demo 链接:https://download.csdn.net/download/JasonXu94/87786702 一、ItemDecoration [外链图片转存失败…

SpringDataRedis

SpringDataRedis SpringDataRedis简介RedisTemplate对Redis操作类型SpringDataRedis快速入门1、引入spring-boot-starter-data-redis依赖2、在application.properties配置Redis信息3、注入RedisTemplate并测试 SpringDataRedis的序列化方式现象分析SpringDataRedis的序列化方式…

基于RK3588的以太网PHY的问题分析

环境:RK3588为荣品电子核心板,PHY为裕太微电子YT8521; 首先上电后识别不到以太网: 1.先怀疑驱动的问题,因为本方案中直接使用的是荣品电子官方的驱动; 对比原理图及驱动。涉及到一个配置问题。 基于时钟来源的不通,驱动程序可分为四种模式,PHY的时钟和TXCLK的时钟;…

北华大学第九届程序设计竞赛 题解

5.14和队友VP一场&#xff0c;第二次VP&#xff0c;状态明显比第一次好很多&#xff0c;总共A了7题&#xff0c;基本是能做出来的都做出来了&#xff0c;最后还剩下接近2小时的时间。。。。。 A "北华"有几何 思路&#xff1a;数图片中“北华”的数量&#xff0c;直…