当前位置: 首页 > news >正文

[第二章—Spring MVC的高级技术] 2.3 处理异常

各位小猿,程序员小猿开发笔记,希望大家共同进步。
引言

异常处理方式:

我是谁——异常处理。 来自那——所有功能正常运行,但出现错误 怎么办——如何处理异常和响应客户端

异常转换响应:

file

file

@ResponseStatus注解

我是谁——Spring框架中的一个注解 用在哪——应用在控制器类或方法上 什么用——用于在控制器方法中指定HTTP响应的状态码。

指定状态码

指定一个特定的HTTP状态码,以便在方法成功执行后返回给客户端。 例如,如果您的方法成功处理了请求并返回了所需的结果,您可以使用@ResponseStatus(HttpStatus.OK)来指定成功的状态码为200。

指定可选的reason参数
除了状态码外,@ResponseStatus还可以指定一个可选的reason参数,用于提供关于响应状态的简要说明。这样做可以增加对API的可读性和理解性。

下面是一个示例: file 在上面的示例中,当请求"/users/{id}"时,如果成功找到对应id的用户,将返回状态码为200的HTTP响应。 2. 异常转换为HTTP状态码: ● 最简单的异常处理方式是将异常映射到HTTP状态码,并包含在响应中。 ● 下面介绍如何将异常映射为HTTP状态码。

7.3.1 将异常映射为HTTP状态码

在默认情况下,Spring会将自身的一些异常自动转换为合适的状态 码。表7. 1列出了这些映射关系。 表7.1 Spri ng的一些异常会默认映射为HTTP状态码 Spring异常 HTTP状态码 file TypeMismatchException 400 - Bad Request

第一步:创建一个spittle方法

file

1. 检索Spittle对象:

○ 通过ID从SpittleRepository中检索Spittle对象。

○ 如果findOne()方法返回Spittle对象,则将其放入模型中,并由名为"spittle"的视图渲染到响应中。

○ 如果findOne()方法返回null,则抛出SpittleNotFoundException异常。

2. 异常处理:

○ 如果findOne()方法返回null,则抛出SpittleNotFoundException异常。

3. 后续处理:

○ SpittleNotFoundException异常需要进行处理,以便给客户端一个合适的响应。 现在就是一个简单的非检查型异常, 如下所示: file

  1. 处理请求并处理异常: ○ 如果调用spittle()方法处理请求,并且获取的结果为空,则会抛出SpittleNotFoundException异常。

    ○ 默认情况下,SpittleNotFoundException会导致500状态码的响应。

    ○ 可以通过映射SpittleNotFoundException来改变默认行为。

  2. 修改默认行为: ○ 当抛出SpittleNotFoundException异常时,表示请求的资源未找到。

    ○ HTTP状态码404是最准确的响应状态码。

    ○ 可以使用@ResponseStatus注解将SpittleNotFoundException映射为HTTP状态码404。 程序清单7.8 @ResponseStatus注解:将异常映射为特定的状态码 file

在引入@ResponseStatus注解之后,如果控制器方法抛出SpittleNotFound-Exception异常的话,响应将会具有404状态 码,这是因为Spittle Not Found。

7.3.2 编写异常处理的方法

程序清单7.9 在处理请求的方法中直接处理异常 file

程序清单7.9中并没有特别之处,它只是在Java中处理异常的基本样例。该方法可以有两个路径,每个路径会有不同的输出。 然而,saveSpittle()方法的复杂性让人感到困惑。

只关注正确的路径,异常交给其他方法处理

首先,让我们首先将saveSpittle()方法中的异常处理方法剥离掉: file 可以看到,方法简单了许多。只关注正常保存Spittle的情况,所以只有一个执行路径,容易理解和测试。

处理抛出异常DuplicateSpittleException

file

流程:

● 在handleDuplicateSpittle()方法上添加@ExceptionHandler注解 ● 返回一个String类型的值,指定要渲染的逻辑视图名

简化异常处理流程

● 通过提取代码创建handleDuplicateSpittle()方法 ● 不需要在每个可能抛出DuplicateSpittleException的方法中添加异常处理代码

@ExceptionHandler

注解的特点

● 可以处理同一个控制器中所有处理器方法抛出的异常

作用范围

标注的方法能够处理同一个控制器类中所有处理器方法的异常,那么你可能会问有没有一种方法能够处理所有控制器中处理器方法所抛出的异常呢。 控制器通知类的异常处理

从Spring 3.2开始,我们可以将异常处理定义到控制器通知类中,以处理所有控制器中处理器方法所抛出的异常。这种方式使得异常处理更加灵活和统一。

本文由博客一文多发平台 OpenWrite 发布!

相关文章:

  • 算法训练营第五十七天|647. 回文子串 516.最长回文子序列
  • 252.【2023年华为OD机试真题(C卷)】局域网中的服务器个数(优先搜索(DFS)-JavaPythonC++JS实现)
  • [已解决]504 Gateway Time-out 网关超时
  • 机器学习第一个项目-----鸢尾花及报错解决
  • unity学习笔记----游戏练习06
  • ZigBee学习——浅析协议栈
  • 网络协议与攻击模拟_08DHCP协议
  • Object.prototype.toString.call个人理解
  • Docker数据管理
  • BTC交易模式 - UXTO - 工具整理
  • 鸿蒙开发案例002
  • 数据结构笔记1
  • php 文件上传
  • Docker部署
  • 书生·浦语大模型--第五节课笔记作业--LMDeploy 大模型量化部署实践
  • __proto__ 和 prototype的关系
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Angular Elements 及其运作原理
  • CAP理论的例子讲解
  • GraphQL学习过程应该是这样的
  • Next.js之基础概念(二)
  • oldjun 检测网站的经验
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • 搞机器学习要哪些技能
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 聚类分析——Kmeans
  • 日剧·日综资源集合(建议收藏)
  • 通过几道题目学习二叉搜索树
  •  一套莫尔斯电报听写、翻译系统
  • Android开发者必备:推荐一款助力开发的开源APP
  • Java数据解析之JSON
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​VRRP 虚拟路由冗余协议(华为)
  • #define、const、typedef的差别
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • ()、[]、{}、(())、[[]]命令替换
  • (1)(1.13) SiK无线电高级配置(六)
  • (3)STL算法之搜索
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET 中的轻量级线程安全
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .net6使用Sejil可视化日志
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .net知识和学习方法系列(二十一)CLR-枚举
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @JsonSerialize注解的使用
  • [20180129]bash显示path环境变量.txt
  • [3300万人的聊天室] 作为产品的上游公司该如何?