各位小猿谤狡,程序員小猿開發(fā)筆記,希望大家共同進(jìn)步卧檐。
引言
異常處理方式:
我是誰——異常處理墓懂。
來自那——所有功能正常運(yùn)行,但出現(xiàn)錯誤
怎么辦——如何處理異常和響應(yīng)客戶端
異常轉(zhuǎn)換響應(yīng):
@ResponseStatus注解
我是誰——Spring框架中的一個注解
用在哪——應(yīng)用在控制器類或方法上
什么用——用于在控制器方法中指定HTTP響應(yīng)的狀態(tài)碼霉囚。
指定狀態(tài)碼
指定一個特定的HTTP狀態(tài)碼捕仔,以便在方法成功執(zhí)行后返回給客戶端。
例如盈罐,如果您的方法成功處理了請求并返回了所需的結(jié)果榜跌,您可以使用@ResponseStatus(HttpStatus.OK)來指定成功的狀態(tài)碼為200。
指定可選的reason參數(shù)
除了狀態(tài)碼外盅粪,@ResponseStatus還可以指定一個可選的reason參數(shù)钓葫,用于提供關(guān)于響應(yīng)狀態(tài)的簡要說明。這樣做可以增加對API的可讀性和理解性票顾。
下面是一個示例:
在上面的示例中础浮,當(dāng)請求"/users/{id}"時帆调,如果成功找到對應(yīng)id的用戶,將返回狀態(tài)碼為200的HTTP響應(yīng)豆同。
- 異常轉(zhuǎn)換為HTTP狀態(tài)碼:
● 最簡單的異常處理方式是將異常映射到HTTP狀態(tài)碼番刊,并包含在響應(yīng)中。
● 下面介紹如何將異常映射為HTTP狀態(tài)碼影锈。
7.3.1 將異常映射為HTTP狀態(tài)碼
在默認(rèn)情況下芹务,Spring會將自身的一些異常自動轉(zhuǎn)換為合適的狀態(tài) 碼。表7. 1列出了這些映射關(guān)系鸭廷。
表7.1 Spri ng的一些異常會默認(rèn)映射為HTTP狀態(tài)碼
Spring異常 HTTP狀態(tài)碼
TypeMismatchException 400 - Bad Request
第一步:創(chuàng)建一個spittle方法
1. 檢索Spittle對象:
○ 通過ID從SpittleRepository中檢索Spittle對象枣抱。
○ 如果findOne()方法返回Spittle對象,則將其放入模型中辆床,并由名為"spittle"的視圖渲染到響應(yīng)中佳晶。
○ 如果findOne()方法返回null,則拋出SpittleNotFoundException異常佛吓。
2. 異常處理:
○ 如果findOne()方法返回null,則拋出SpittleNotFoundException異常垂攘。
3. 后續(xù)處理:
○ SpittleNotFoundException異常需要進(jìn)行處理维雇,以便給客戶端一個合適的響應(yīng)。
現(xiàn)在就是一個簡單的非檢查型異常晒他, 如下所示:
- 處理請求并處理異常:
○ 如果調(diào)用spittle()方法處理請求吱型,并且獲取的結(jié)果為空,則會拋出SpittleNotFoundException異常陨仅。
○ 默認(rèn)情況下津滞,SpittleNotFoundException會導(dǎo)致500狀態(tài)碼的響應(yīng)。
○ 可以通過映射SpittleNotFoundException來改變默認(rèn)行為灼伤。
- 修改默認(rèn)行為:
○ 當(dāng)拋出SpittleNotFoundException異常時触徐,表示請求的資源未找到。
○ HTTP狀態(tài)碼404是最準(zhǔn)確的響應(yīng)狀態(tài)碼狐赡。
○ 可以使用@ResponseStatus注解將SpittleNotFoundException映射為HTTP狀態(tài)碼404撞鹉。
程序清單7.8 @ResponseStatus注解:將異常映射為特定的狀態(tài)碼
在引入@ResponseStatus注解之后,如果控制器方法拋出SpittleNotFound-Exception異常的話颖侄,響應(yīng)將會具有404狀態(tài) 碼鸟雏,這是因為Spittle Not Found。
7.3.2 編寫異常處理的方法
程序清單7.9 在處理請求的方法中直接處理異常
程序清單7.9中并沒有特別之處览祖,它只是在Java中處理異常的基本樣例孝鹊。該方法可以有兩個路徑,每個路徑會有不同的輸出展蒂。
然而又活,saveSpittle()方法的復(fù)雜性讓人感到困惑苔咪。
只關(guān)注正確的路徑,異常交給其他方法處理
首先皇钞,讓我們首先將saveSpittle()方法中的異常處理方法剝離掉:
可以看到悼泌,方法簡單了許多。只關(guān)注正常保存Spittle的情況夹界,所以只有一個執(zhí)行路徑馆里,容易理解和測試。
處理拋出異常DuplicateSpittleException
流程:
● 在handleDuplicateSpittle()方法上添加@ExceptionHandler注解
● 返回一個String類型的值可柿,指定要渲染的邏輯視圖名
簡化異常處理流程
● 通過提取代碼創(chuàng)建handleDuplicateSpittle()方法
● 不需要在每個可能拋出DuplicateSpittleException的方法中添加異常處理代碼
@ExceptionHandler
注解的特點(diǎn)
● 可以處理同一個控制器中所有處理器方法拋出的異常
作用范圍
標(biāo)注的方法能夠處理同一個控制器類中所有處理器方法的異常鸠踪,那么你可能會問有沒有一種方法能夠處理所有控制器中處理器方法所拋出的異常呢。
控制器通知類的異常處理
從Spring 3.2開始复斥,我們可以將異常處理定義到控制器通知類中营密,以處理所有控制器中處理器方法所拋出的異常。這種方式使得異常處理更加靈活和統(tǒng)一目锭。
本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布评汰!