各位小猿,程序员小猿开发笔记,希望大家共同进步。
引言
异常处理方式:
我是谁——异常处理。
来自那——所有功能正常运行,但出现错误
怎么办——如何处理异常和响应客户端
异常转换响应:
@ResponseStatus注解
我是谁——Spring框架中的一个注解
用在哪——应用在控制器类或方法上
什么用——用于在控制器方法中指定HTTP响应的状态码。
指定状态码
指定一个特定的HTTP状态码,以便在方法成功执行后返回给客户端。
例如,如果您的方法成功处理了请求并返回了所需的结果,您可以使用@ResponseStatus(HttpStatus.OK)来指定成功的状态码为200。
指定可选的reason参数
除了状态码外,@ResponseStatus还可以指定一个可选的reason参数,用于提供关于响应状态的简要说明。这样做可以增加对API的可读性和理解性。
下面是一个示例:
在上面的示例中,当请求"/users/{id}"时,如果成功找到对应id的用户,将返回状态码为200的HTTP响应。
异常转换为HTTP状态码:
● 最简单的异常处理方式是将异常映射到HTTP状态码,并包含在响应中。
● 下面介绍如何将异常映射为HTTP状态码。7.3.1 将异常映射为HTTP状态码
在默认情况下,Spring会将自身的一些异常自动转换为合适的状态 码。表7. 1列出了这些映射关系。
表7.1 Spri ng的一些异常会默认映射为HTTP状态码
Spring异常 HTTP状态码
TypeMismatchException 400 - Bad Request第一步:创建一个spittle方法
1. 检索Spittle对象:
○ 通过ID从SpittleRepository中检索Spittle对象。
○ 如果findOne()方法返回Spittle对象,则将其放入模型中,并由名为"spittle"的视图渲染到响应中。
○ 如果findOne()方法返回null,则抛出SpittleNotFoundException异常。
2. 异常处理:
○ 如果findOne()方法返回null,则抛出SpittleNotFoundException异常。
3. 后续处理:
○ SpittleNotFoundException异常需要进行处理,以便给客户端一个合适的响应。
现在就是一个简单的非检查型异常, 如下所示:处理请求并处理异常:
○ 如果调用spittle()方法处理请求,并且获取的结果为空,则会抛出SpittleNotFoundException异常。○ 默认情况下,SpittleNotFoundException会导致500状态码的响应。
○ 可以通过映射SpittleNotFoundException来改变默认行为。
修改默认行为:
○ 当抛出SpittleNotFoundException异常时,表示请求的资源未找到。○ HTTP状态码404是最准确的响应状态码。
○ 可以使用@ResponseStatus注解将SpittleNotFoundException映射为HTTP状态码404。
程序清单7.8 @ResponseStatus注解:将异常映射为特定的状态码
在引入@ResponseStatus注解之后,如果控制器方法抛出SpittleNotFound-Exception异常的话,响应将会具有404状态 码,这是因为Spittle Not Found。
7.3.2 编写异常处理的方法
程序清单7.9中并没有特别之处,它只是在Java中处理异常的基本样例。该方法可以有两个路径,每个路径会有不同的输出。
然而,saveSpittle()方法的复杂性让人感到困惑。
只关注正确的路径,异常交给其他方法处理
首先,让我们首先将saveSpittle()方法中的异常处理方法剥离掉:
可以看到,方法简单了许多。只关注正常保存Spittle的情况,所以只有一个执行路径,容易理解和测试。