[第二章—Spring MVC的高級技術(shù)] 2.3 處理異常

各位小猿谤狡,程序員小猿開發(fā)筆記,希望大家共同進(jìn)步卧檐。

引言

異常處理方式:

我是誰——異常處理墓懂。
來自那——所有功能正常運(yùn)行,但出現(xiàn)錯誤
怎么辦——如何處理異常和響應(yīng)客戶端

異常轉(zhuǎn)換響應(yīng):

file
file

@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的可讀性和理解性票顾。

下面是一個示例:


file

在上面的示例中础浮,當(dāng)請求"/users/{id}"時帆调,如果成功找到對應(yīng)id的用戶,將返回狀態(tài)碼為200的HTTP響應(yīng)豆同。

  1. 異常轉(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)碼


file

TypeMismatchException 400 - Bad Request

第一步:創(chuàng)建一個spittle方法

file

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)在就是一個簡單的非檢查型異常晒他, 如下所示:


file
  1. 處理請求并處理異常:
    ○ 如果調(diào)用spittle()方法處理請求吱型,并且獲取的結(jié)果為空,則會拋出SpittleNotFoundException異常陨仅。

○ 默認(rèn)情況下津滞,SpittleNotFoundException會導(dǎo)致500狀態(tài)碼的響應(yīng)。

○ 可以通過映射SpittleNotFoundException來改變默認(rèn)行為灼伤。

  1. 修改默認(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)碼


file

在引入@ResponseStatus注解之后,如果控制器方法拋出SpittleNotFound-Exception異常的話颖侄,響應(yīng)將會具有404狀態(tài) 碼鸟雏,這是因為Spittle Not Found。

7.3.2 編寫異常處理的方法

程序清單7.9 在處理請求的方法中直接處理異常


file

程序清單7.9中并沒有特別之處览祖,它只是在Java中處理異常的基本樣例孝鹊。該方法可以有兩個路徑,每個路徑會有不同的輸出展蒂。
然而又活,saveSpittle()方法的復(fù)雜性讓人感到困惑苔咪。

只關(guān)注正確的路徑,異常交給其他方法處理

首先皇钞,讓我們首先將saveSpittle()方法中的異常處理方法剝離掉:


file

可以看到悼泌,方法簡單了許多。只關(guān)注正常保存Spittle的情況夹界,所以只有一個執(zhí)行路徑馆里,容易理解和測試。

處理拋出異常DuplicateSpittleException

file

流程:

● 在handleDuplicateSpittle()方法上添加@ExceptionHandler注解
● 返回一個String類型的值可柿,指定要渲染的邏輯視圖名

簡化異常處理流程

● 通過提取代碼創(chuàng)建handleDuplicateSpittle()方法
● 不需要在每個可能拋出DuplicateSpittleException的方法中添加異常處理代碼

@ExceptionHandler

注解的特點(diǎn)

● 可以處理同一個控制器中所有處理器方法拋出的異常

作用范圍

標(biāo)注的方法能夠處理同一個控制器類中所有處理器方法的異常鸠踪,那么你可能會問有沒有一種方法能夠處理所有控制器中處理器方法所拋出的異常呢。
控制器通知類的異常處理

從Spring 3.2開始复斥,我們可以將異常處理定義到控制器通知類中营密,以處理所有控制器中處理器方法所拋出的異常。這種方式使得異常處理更加靈活和統(tǒng)一目锭。

本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布评汰!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市痢虹,隨后出現(xiàn)的幾起案子被去,更是在濱河造成了極大的恐慌,老刑警劉巖奖唯,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惨缆,死亡現(xiàn)場離奇詭異,居然都是意外死亡丰捷,警方通過查閱死者的電腦和手機(jī)坯墨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來病往,“玉大人捣染,你說我怎么就攤上這事⊥O铮” “怎么了液斜?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長叠穆。 經(jīng)常有香客問我少漆,道長,這世上最難降的妖魔是什么硼被? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任示损,我火速辦了婚禮,結(jié)果婚禮上嚷硫,老公的妹妹穿的比我還像新娘检访。我一直安慰自己始鱼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布脆贵。 她就那樣靜靜地躺著医清,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卖氨。 梳的紋絲不亂的頭發(fā)上会烙,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音筒捺,去河邊找鬼柏腻。 笑死,一個胖子當(dāng)著我的面吹牛系吭,可吹牛的內(nèi)容都是我干的五嫂。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼肯尺,長吁一口氣:“原來是場噩夢啊……” “哼沃缘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起则吟,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤槐臀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后逾滥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體峰档,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡败匹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年寨昙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掀亩。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡舔哪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出槽棍,到底是詐尸還是另有隱情捉蚤,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布炼七,位于F島的核電站缆巧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏豌拙。R本人自食惡果不足惜陕悬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望按傅。 院中可真熱鬧捉超,春花似錦胧卤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惜纸,卻和暖如春叶撒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背堪簿。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工痊乾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人椭更。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓哪审,卻偏偏與公主長得像,于是被迫代替她去往敵國和親虑瀑。 傳聞我的和親對象是個殘疾皇子湿滓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容