SSM整合详细教学(中)

news2024/9/27 12:16:33

在这里插入图片描述

SSM整合详细教学(中)

    • 三、异常处理器
      • 问题导入
      • 1 异常介绍
      • 2 异常处理器
        • 2.2.1 编写异常处理器
        • 2.2.2 @RestControllerAdvice注解介绍
        • 2.2.3 @ExceptionHandler注解介绍
    • 四、项目异常处理方案
      • 问题导入
      • 1 项目异常分类
      • 2 项目异常处理方案
      • 3 项目异常处理代码实现
        • 3.1 根据异常分类自定义异常类
          • 3.1.1 自定义项目系统级异常
          • 3.1.2 自定义项目业务级异常
        • 3.2 自定义异常编码(持续补充)
        • 3.3 触发自定义异常
        • 3.4 在异常通知类中拦截并处理异常

三、异常处理器

问题导入

问题1:项目各个个层级均可能出现异常,异常处理代码书写在哪一层?

1 异常介绍

  • 程序开发过程中不可避免的会遇到异常现象,我们不能让用户看到这样的页面数据

image-20210805172011686

  • 出现异常现象的常见位置与常见诱因如下:
    • 框架内部抛出的异常:因使用不合规导致
    • 数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时)
    • 业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务书写操作,导致索引异常等)
    • 表现层抛出的异常:因数据收集、校验等规则导致(例如:不匹配的数据类型间导致异常)
    • 工具类抛出的异常:因工具类书写不严谨不够健壮导致(例如:必要释放的连接长期未释放等)

2 异常处理器

2.2.1 编写异常处理器

@RestControllerAdvice  //用于标识当前类为REST风格对应的异常处理器
public class ProjectExceptionAdvice {

    //统一处理所有的Exception异常
    @ExceptionHandler(Exception.class)
    public Result doOtherException(Exception ex){
        return new Result(666,null);
    }
}

使用异常处理器之后的效果

image-20210805171924452

2.2.2 @RestControllerAdvice注解介绍

  • 名称:@RestControllerAdvice

  • 类型:类注解

  • 位置:Rest风格开发的控制器增强类定义上方

  • 作用:为Rest风格开发的控制器类做增强

  • 说明:此注解自带@ResponseBody注解与@Component注解,具备对应的功能

2.2.3 @ExceptionHandler注解介绍

  • 名称:@ExceptionHandler
  • 类型:方法注解
  • 位置:专用于异常处理的控制器方法上方
  • 作用:设置指定异常的处理方案,功能等同于控制器方法,出现异常后终止原始控制器执行,并转入当前方法执行
  • 说明:此类方法可以根据处理的异常不同,制作多个方法分别处理对应的异常

四、项目异常处理方案

问题导入

请说出项目当前异常的分类以及对应类型异常该如何处理?

1 项目异常分类

  • 业务异常(BusinessException)
    • 规范的用户行为产生的异常
    • 不规范的用户行为操作产生的异常
  • 系统异常(SystemException)
    • 项目运行过程中可预计且无法避免的异常
  • 其他异常(Exception)
    • 编程人员未预期到的异常

2 项目异常处理方案

  • 业务异常(BusinessException)
    • 发送对应消息传递给用户,提醒规范操作
  • 系统异常(SystemException)
    • 发送固定消息传递给用户,安抚用户
    • 发送特定消息给运维人员,提醒维护
    • 记录日志
  • 其他异常(Exception)
    • 发送固定消息传递给用户,安抚用户
    • 发送特定消息给编程人员,提醒维护(纳入预期范围内)
    • 记录日志

3 项目异常处理代码实现

3.1 根据异常分类自定义异常类

3.1.1 自定义项目系统级异常
//自定义异常处理器,用于封装异常信息,对异常进行分类
public class SystemException extends RuntimeException{
    private Integer code;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public SystemException(Integer code, String message) {
        super(message);
        this.code = code;
    }

    public SystemException(Integer code, String message, Throwable cause) {
        super(message, cause);
        this.code = code;
    }
}
3.1.2 自定义项目业务级异常
//自定义异常处理器,用于封装异常信息,对异常进行分类
public class BusinessException extends RuntimeException{
    private Integer code;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public BusinessException(Integer code, String message) {
        super(message);
        this.code = code;
    }

    public BusinessException(Integer code,String message,Throwable cause) {
        super(message, cause);
        this.code = code;
    }
}

3.2 自定义异常编码(持续补充)

public class Code {

	//之前其他状态码省略没写,以下是新补充的状态码,可以根据需要自己补充
    
    public static final Integer SYSTEM_ERR = 50001;
    public static final Integer SYSTEM_TIMEOUT_ERR = 50002;
    public static final Integer SYSTEM_UNKNOW_ERR = 59999;
    public static final Integer BUSINESS_ERR = 60002;
    
}

3.3 触发自定义异常

@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;

	//在getById演示触发异常,其他方法省略没有写进来
    public Book getById(Integer id) {
        //模拟业务异常,包装成自定义异常
        if(id <0){
            throw new BusinessException(Code.BUSINESS_ERR,"请不要使用你的技术挑战我的耐性!");
        }
    }
}

3.4 在异常通知类中拦截并处理异常

@RestControllerAdvice //用于标识当前类为REST风格对应的异常处理器
public class ProjectExceptionAdvice {
    //@ExceptionHandler用于设置当前处理器类对应的异常类型
    @ExceptionHandler(SystemException.class)
    public Result doSystemException(SystemException ex){
        //记录日志
        //发送消息给运维
        //发送邮件给开发人员,ex对象发送给开发人员
        return new Result(ex.getCode(),null,ex.getMessage());
    }

    @ExceptionHandler(BusinessException.class)
    public Result doBusinessException(BusinessException ex){
        return new Result(ex.getCode(),null,ex.getMessage());
    }

    //除了自定义的异常处理器,保留对Exception类型的异常处理,用于处理非预期的异常
    @ExceptionHandler(Exception.class)
    public Result doOtherException(Exception ex){
        //记录日志
        //发送消息给运维
        //发送邮件给开发人员,ex对象发送给开发人员
        return new Result(Code.SYSTEM_UNKNOW_ERR,null,"系统繁忙,请稍后再试!");
    }
}

测试:在postman中发送请求访问getById方法,传递参数-1,得到以下结果:

image-20210805173815730

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

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

相关文章

zookeeper下载安装集群部署

文章目录 一、zookeeper官网下载二、JDK环境安装三、zookeeper安装1.zookeeper解压2.zookeeper配置文件介绍 克隆服务器1.网络检查2.集群配置3.启动集群 一、zookeeper官网下载 下载地址&#xff1a;https://archive.apache.org/dist/zookeeper/找到对应的版本下载 二、JDK环…

Python3.10动态修改Windows系统(win10/win11)本地IP地址(静态IP)

一般情况下&#xff0c;局域网里的终端比如本地服务器设置静态IP的好处是可以有效减少网络连接时间&#xff0c;原因是过程中省略了每次联网后从DHCP服务器获取IP地址的流程&#xff0c;缺点是容易引发IP地址的冲突&#xff0c;当然&#xff0c;还有操作层面的繁琐&#xff0c;…

SpringBoot ( 一 ) 搭建项目环境

1.搭建环境 1.1.创建项目向导 使用idea中的向导创建SpringBoot项目 1.1.1.建立新的项目 位置 : 菜单 > File > New > Project… 1.1.2.选择向导 默认的向导URL 是 https://start.spring.io 建议使用 https://start.aliyun.com 1.1.3.配置项目信息 Group : 组织…

从地方旅游的宣传谈起:如何吸引主流媒体报道,强势刷屏?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 五一小长假已经过去好几天了&#xff0c;大家渐渐的从假期舒适的闲暇转到正常的工作生活中了&#xff0c;但利用五一热点宣传的余温还在继续&#xff0c;今天胡老师就i注意到一篇题为&am…

机器学习之朴素贝斯二、情感分析

目录标题 一、什么是朴素贝叶斯&#xff1f;二、利用朴素贝叶斯进行情感分析1. 数据类别说明2. 什么是词袋模型3. 数据展示4. 利用词袋模型进行词表构建5. 到了这一步&#xff0c;我们的前期工作都已经准备好了&#xff0c;有了样本的向量化数据&#xff0c;开始进行 朴素贝叶斯…

电容笔哪个厂家的产品比较好?苹果平板的电容笔推荐

从目前来说&#xff0c;这个苹果的正版电容笔&#xff0c;售价真的是太贵了&#xff0c;一支就要接近上千元。事实上&#xff0c;对于那些没有很多预算的人来说&#xff0c;平替电容笔是一个很好的选择。一支苹果电容笔&#xff0c;价格是四支平替电容笔的四倍&#xff0c;但平…

机器人控制系统学习和研究中数学的重要性

其实具备科学思维的方式非常非常难&#xff0c;很多情况下脑海中并非客观事实&#xff0c;而是充满了幻觉。 如果在各种AI工具中问及这样的问题&#xff0c;会得到类似如下回复&#xff1a; 机器人控制系统学习和研究中数学的重要性主要体现在以下几个方面&#xff1a; 机器人运…

C961W扫描枪

影像解码技术&#xff0c;微米级条码&#xff0c;轻松扫描 百万像素引擎&#xff0c;擅长读取制造业遇到的高密度&#xff0c;微小尺寸条码。 ≥3mil读码密度&#xff0c;准确解码。 一、产品简介 C961W是一款基于先进影像解码技术和微功率无线跳频传输技术的无线高性能、高…

Java入门 - 内含Java基础,Java高级

Java基础入门 - 内含Java基础&#xff0c;Java高级 Java 基本介绍Java 学习须知Java 学习文档Java 基础Java 基础语法Java 对象与类Java 基本数据类型Java 变量类型Java 修饰符Java 运算符Java 循环结构Java 条件语句Java switch caseJava 数组Java 日期与时间Java 正则表达式J…

好的索引当然是要覆盖了!

如果你的查询中用到了索引&#xff0c;这是一个进步&#xff0c;如果能够更进一步&#xff0c;用到了覆盖索引&#xff0c;那么就更牛了&#xff01;当我们设计一个索引的时候&#xff0c;如果能够从一个更加全面的角度去设计这个索引&#xff0c;不仅考虑到 where 中的条件&am…

大数据处理技术:从Hadoop到Spark的演进和比较

在过去的十年中&#xff0c;大数据技术的发展突飞猛进&#xff0c;各种开源大数据处理框架层出不穷&#xff0c;其中Hadoop和Spark是最受欢迎的两个框架。Hadoop是最早的开源大数据处理框架之一&#xff0c;而Spark则是在Hadoop之后出现的&#xff0c;它在内存计算和数据处理方…

for...in的用法

一、for…in的用法 1.用于对象的迭代&#xff0c;迭代除了Symbol属性外的可枚举的属性&#xff0c;包括继承的可枚举的属性&#xff08;可以用于遍历数组&#xff0c;但不建议这么用&#xff09;&#xff1b; const obj {a: 1,b: 2,c: 3,fn: function () {} }obj[Symbol()] …

Vite 的安装和基本使用

注意&#xff1a;Vite 本身也是依赖 Node.js 的&#xff0c;所以也需要安装好 Node 环境&#xff0c;并且 Vite 要求 Node 的版本要大于等于 12 版本。 下面&#xff0c;我们不会按照 Vite 官方文档中那样直接用 Vite 的脚手架搭建出一个完整的项目&#xff08;npm init vitela…

面向Java开发者的ChatGPT提示词工程(1)

各位Java开发者们&#xff0c;欢迎来到万猫学社&#xff01;在这里&#xff0c;我将和大家分享ChatGPT提示词工程的系列文章&#xff0c;希望能够和大家一起学习和探讨提示词的最佳实践。 虽然互联网上已经有很多有关提示词的材料&#xff0c;比如那些“每个人都必须知道的30个…

服务(第十八篇)mysql-索引、事务、存储引擎

索引&#xff1a; 相当于一本书的目录。 作用&#xff1a;①对字段进行升序排序 ②加快表的查询速度 副作用&#xff1a;①索引会额外占用磁盘空间 ②更新有索引的表效率很慢 使用场景&#xff1a; ①在没有索引查询某行数据&#xff0c;需要扫描全表定位到某行数据 ②有索…

【876. 链表的中间结点】

Leetcode 876. 链表的中间结点 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一…

第三章数据链路层

1.数据链路层的概述 1.0地位 数据链路层在网络体系结构中所处的地位 链路(Link)就是从一个结点到相邻结点的一段物理线路&#xff0c;而中间没有任何其他的交换结点。数据链路(Data Link)是指把实现通信协议的硬件和软件加到链路上&#xff0c;就构成了数据链路。数据链路层以帧…

Word中同一行文字 左边居左,右边居右,并且居右的文字加长也不换行

本文将的不是Java知识&#xff0c;是Word格式问题。 如图&#xff0c;想实现下面Word中&#xff0c;同一行文字红色框内的居左显示&#xff0c;蓝色框内的居右显示&#xff1a; 步骤&#xff1a; 1.选中要居右显示的文字&#xff0c;点击左上角的小直角标志&#xff0c;选择右…

FS2116A升压IC

FS2116A升压输出12V电流1.5A芯片IC,支持3.7V升压5V3.6A&#xff0c;3.7V升压9V2A&#xff0c;3.7V升压12V1.5A&#xff0c;和两串锂电池7.4V升压 6V3.6A&#xff0c;两串锂电池7.4V升压12V2.5A输出功率。支持宽输入电压&#xff0c;外围少&#xff0c;效率高。7.4V或者8.4V电压…

mysql的存储函数与存储过程

1. 存储过程概述 我们前面所学习的 MySQL 语句都是针对一个表或几个表的单条 SQL 语句&#xff0c;但是在数据库的实际操作中&#xff0c;经常会有需要多条 SQL 语句处理多个表才能完成的操作。例如&#xff0c;为了确认学生能否毕业&#xff0c;需要同时查询学生档案表、成绩…