SpringBoot統(tǒng)一異常處理參數(shù)校驗(yàn)異常返回定制數(shù)據(jù)

時(shí)間有些緊迫拣宏,所以文中有些待考證的地方還未進(jìn)行測(cè)驗(yàn)深究缀拭,大家見(jiàn)諒织阳。
自己造算是了個(gè)輪子眶蕉,個(gè)人感覺(jué)這個(gè)輪子以后很多地方都會(huì)用到的吧。

需求起因:
這兩天剛開(kāi)始寫SpringBoot唧躲,用到了JPA的東西造挽,然后對(duì)于后端處理業(yè)務(wù)比較重要的一塊就是參數(shù)的校驗(yàn)。個(gè)人目前看來(lái)校驗(yàn)分兩類弄痹,第一類是類似Validator的東西饭入,就是根據(jù)輸入的參數(shù)直接在實(shí)體上設(shè)定好規(guī)則,然后傳入?yún)?shù)的時(shí)候進(jìn)行檢驗(yàn)合理性肛真,比如NotNull(目前僅用到了于javax包下的validation里面的那些constraints)谐丢,出現(xiàn)異常就拋出。第二類就是涉及到數(shù)據(jù)庫(kù)的一種校驗(yàn)毁欣,比如Unique校驗(yàn)庇谆,據(jù)我目前所知好像hibernate本身是沒(méi)有替我們進(jìn)行數(shù)據(jù)庫(kù)比對(duì),所以涉及到數(shù)據(jù)庫(kù)中的校驗(yàn)就需要自己來(lái)限制了凭疮。
然后在網(wǎng)上看到了關(guān)于統(tǒng)一異常處理機(jī)制的東西饭耳,用途就是對(duì)于各種校驗(yàn)產(chǎn)生的異常,也需要像其他封裝好的數(shù)據(jù)一樣执解,對(duì)前臺(tái)展示統(tǒng)一的數(shù)據(jù)寞肖。第二類的校驗(yàn)由于涉及到了數(shù)據(jù)庫(kù),所以一般的操作就是自己查一下數(shù)據(jù)庫(kù)衰腌,然后如果發(fā)現(xiàn)異常就手動(dòng)返回一個(gè)正規(guī)數(shù)據(jù)新蟆,并不是真正意義上的異常。這種方式返回異常的時(shí)候可能跟原來(lái)差不太多右蕊,可能不夠優(yōu)雅琼稻?不對(duì)。好像是這么做不調(diào)用異常的話饶囚,涉及到事務(wù)的情況好像是沒(méi)辦法回滾的帕翻。(事務(wù)這塊也有待考證,網(wǎng)上有的說(shuō)只有沒(méi)被捕獲的RuntimeException才能觸發(fā)事務(wù)回滾)補(bǔ)充:實(shí)驗(yàn)測(cè)試萝风,首先開(kāi)啟事務(wù)必須要聲明 @Transactional(方法級(jí)) 注解嘀掸,然后拋出的繼承的繼承RuntimeException就可以觸發(fā)回滾,之前提到的捕獲應(yīng)該指的是try catch的捕獲规惰,前后文的異常捕獲器并不會(huì)導(dǎo)致事務(wù)不會(huì)回滾睬塌。
而對(duì)于第一類的異常,toString出來(lái)的對(duì)象就比較麻煩了。對(duì)于我這種剛寫Spring兩三天的人揩晴,給我那么那么多數(shù)據(jù)我也沒(méi)啥用勋陪,也看不懂。但是里面的錯(cuò)誤原因文狱,也就是之前我在參數(shù)校驗(yàn)時(shí)候自定義的返回?cái)?shù)據(jù)卻是我想要的粥鞋。按照常規(guī)的做法是,在Controller層綁定一個(gè)BindingResult的對(duì)象瞄崇,跟@Valid和其他請(qǐng)求參數(shù)一起傳進(jìn)來(lái)呻粹,然后再在BindingResult里頭挨個(gè)處理,遍歷拿出來(lái)結(jié)果進(jìn)行獲取苏研。這樣才能對(duì)結(jié)果進(jìn)行定制處理等浊,不然只能在控制臺(tái)報(bào)一些神仙錯(cuò)誤。想一下這時(shí)候就會(huì)發(fā)現(xiàn)摹蘑,對(duì)于參數(shù)驗(yàn)證的報(bào)錯(cuò)和對(duì)BindingResult的處理會(huì)再每個(gè)Controller里頭都寫一次吧差不多筹燕。因?yàn)橐祷亟y(tǒng)一的錯(cuò)誤數(shù)據(jù)嘛。異常捕獲機(jī)制就顯得雪中送炭了這時(shí)候衅鹿。
這時(shí)候在網(wǎng)上看到了關(guān)于一些統(tǒng)一異常處理的東西撒踪,里面用到了全局異常捕獲器。就是對(duì)于某些特有的異常大渤,可以做特有的處理制妄。找到控制臺(tái)對(duì)于參數(shù)校驗(yàn)的一些異常,然后在捕獲器里頭進(jìn)行捕獲泵三,特別處理耕捞。嗯邏輯好簡(jiǎn)單,哇烫幕,迷了我?guī)讉€(gè)小時(shí)的東西隔一天一看就變得俺抽。。沒(méi)那么有成就感了较曼。然后就可以拋出的異常進(jìn)行統(tǒng)一的返回?cái)?shù)據(jù)了磷斧。并且在Controller里面,就不需要開(kāi)發(fā)人員再對(duì)參數(shù)的異常進(jìn)行管理了

附上代碼:


image.png

全局異常捕獲器


image.png

統(tǒng)一返回?cái)?shù)據(jù)類型
image.png

自定義異常處理類

最后希望踩我的同學(xué)出來(lái)交流一下捷犹,個(gè)人也是小白一枚~希望指點(diǎn)

有關(guān)的項(xiàng)目源碼在我的個(gè)人項(xiàng)目中均可以找到弛饭,甚至發(fā)現(xiàn)更神奇的東西噢~(在線表單項(xiàng)目,可自定義表單組件)
小的在此請(qǐng)大家閑暇之余賞個(gè)Star嘻嘻嘻
https://github.com/syhdeclan/OnlineFormJava

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末伏恐,一起剝皮案震驚了整個(gè)濱河市孩哑,隨后出現(xiàn)的幾起案子栓霜,更是在濱河造成了極大的恐慌翠桦,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異销凑,居然都是意外死亡丛晌,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門斗幼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)澎蛛,“玉大人,你說(shuō)我怎么就攤上這事蜕窿∧甭撸” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵桐经,是天一觀的道長(zhǎng)毁兆。 經(jīng)常有香客問(wèn)我,道長(zhǎng)阴挣,這世上最難降的妖魔是什么气堕? 我笑而不...
    開(kāi)封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮畔咧,結(jié)果婚禮上茎芭,老公的妹妹穿的比我還像新娘。我一直安慰自己誓沸,他們只是感情好梅桩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蔽介,像睡著了一般摘投。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上虹蓄,一...
    開(kāi)封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天犀呼,我揣著相機(jī)與錄音,去河邊找鬼薇组。 笑死外臂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的律胀。 我是一名探鬼主播宋光,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼炭菌!你這毒婦竟也來(lái)了罪佳?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤黑低,失蹤者是張志新(化名)和其女友劉穎赘艳,沒(méi)想到半個(gè)月后酌毡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蕾管,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年枷踏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掰曾。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡旭蠕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出旷坦,到底是詐尸還是另有隱情掏熬,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布秒梅,位于F島的核電站孽江,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏番电。R本人自食惡果不足惜岗屏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漱办。 院中可真熱鬧这刷,春花似錦、人聲如沸娩井。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)洞辣。三九已至咐刨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扬霜,已是汗流浹背定鸟。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留著瓶,地道東北人联予。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像材原,于是被迫代替她去往敵國(guó)和親沸久。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

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