日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

SpringBoot中的異常處理與參數校驗的方法實現

瀏覽:22日期:2023-05-22 18:51:15

兄弟們好,這次來跟老鐵交流兩個問題,異常和參數校驗,在說參數校驗之前我們先來說異常處理吧,因為后面參數的校驗會牽扯到異常處理這塊的內容。

異常處理

說到異常處理,我不知道大家有沒有寫過或者遇到過如下的寫法。

public void saveUser() { try { // 所有的業務內容,目測幾百行 }catch (Exception e) { e.printStackTrace(); }}

如果出現上述的代碼,里面包含了大量的業務代碼,如果是你寫的,趕緊改掉,不是你寫的找寫的,吐槽趕緊改掉。

存在的問題:

1、會遇到性能瓶頸;2、很難定位問題;3、try嵌套過多可讀性很差;

不管什么原因出現了上述代碼,那么最好還是改一下,如果非要在業務代碼中try,那么也應該只在可能出現異常的地方使用try,而不是try整個業務代碼。

SpringBoot中的異常捕獲

直接上代碼

@RestControllerAdvicepublic class GlobalException { @ExceptionHandler(value = Exception.class) // 捕獲的異常類型 public Object globalException(Exception ex) { // 異常處理 ex.printStackTrace(); return '出現異常'; }}

那么在SpringBoot中我們就可以通過這樣的一個配置可以獲取到項目中出現異常的地方,我們可以在這個方法中可以獲取出現異常的類的詳細信息,那么是不是所有的異常我們全部使用Exception來處理呢?那么肯定是不合適的。我們模擬一個by zero的異常,然后再配置一個處理ArithmeticException異常的處理器,代碼如下:

@RestControllerAdvicepublic class GlobalException { @ExceptionHandler(value = Exception.class) // 捕獲的異常類型 public Object globalException(Exception ex) { ex.printStackTrace(); return '出現異常'; } @ExceptionHandler(value = ArithmeticException.class) public Object arithmeticException(ArithmeticException ex) { ex.printStackTrace(); return 'by zero異常'; }}

如果這個時候出現by zero異常,走ArithmeticException異常處理,原因就是因為如果有更小范圍的異常處理類,那么會走小范圍的異常處理器。不會走globalException更大的異常處理類。

這樣處理之后,我們就不需要在項目中去寫那么多的try了,是不是方便了很多。

除了使用這些已經存在的異常外,其實我們還可以自定義我們的異常,比如我們常用的用戶未登錄異常、參數錯誤異常等等。但是考慮到這篇文章的篇幅問題,這次就先不寫了,有興趣的朋友可以直接下面留言,人多了我盡快更新。

注意坑:

這里跟大家分享一個踩過的坑,不能再Filter過濾器中拋出異常,如果通過在過濾器中拋出異常,然后通過異常處理類來處理,那么是不可能的,因為處理器是捕獲不到Filter拋出的異常的。

參數校驗

老規矩,先來看一段代碼

@RequestMapping(value = '/save/user')public Object saveUser(UserPO userPO) { if (userPO.getAge() == null) { return '請求參數錯誤'; } if (userPO.getSex() == null) { return '請求參數錯誤'; } if (userPO.getUsername() == null) { return '請求參數錯誤'; } // ... return 'SUCCESS';}

應該見過這種校驗參數的吧,說實話我寫過。越寫感覺越low,所以狠心一下,還是趁早改吧。

@Validated注解

這個注解其實是Spring提供的,如果你的項目不是SpringBoot項目,需要引一下需要的pom文件,如果是,那么就不用管了,SpringBoot已經幫我們引入了。

網上看了好多的博客,許多都說的不是很全,大部分都是說JavaBean參數的校驗,但是我們項目中有些接口可能就涉及一個參數,根本不需要寫一個JavaBean,對于單一參數的校驗好多博客還是沒說的,那么我們這次就一次性講清楚。

單一參數的校驗

直接看代碼吧

@Validated@RestControllerpublic class BookController { @RequestMapping(value = '/book/info', method = RequestMethod.GET) public Object getBookInfo(@NotBlank(message = '書籍ID不能為空') String bookId) { return 'SUCCESS'; }}

這里要跟大家特別說明下,如果是單一參數的校驗,那么我們必須要在類上面添加@Validated注解,不然我們整個單個參數校驗是不會生效的,可以看到我們在校驗參數bookId的時候,使用了@NotBlank那么顧名思義,就是這個參數不能為null,在調用了trim()方法之后也不能是空字符。

如果參數不滿足要求,那么會拋出ConstraintViolationException異常,這個異常只有在單一參數校驗的時候拋出,如果你的參數是JavaBean,那么就不是這個異常了。

既然我們知道了它會拋出異常,并且我們也知道是什么異常類型,那么久超級簡單了,我們可以直接使用上面剛學的異常處理類來處理我們的異常。

我找個里面寫的比較簡單,如果你想寫的復雜一點,其實也是可以的,但是作為后端來說,我覺得沒必要,因為我們不能給前端提示太過明顯的錯誤提示,防止別人惡意攻擊我們,就像用戶名密碼錯誤,不能明確的告訴用戶到底是用戶名錯誤還是密碼錯誤,只能提示用戶名或密碼錯誤。

如果大家非要把詳細的錯誤信息打出來,要看到到底是哪個參數校驗不通過,也可以通過下面的方式將具體的參數錯誤信息打印出來。輸出的錯誤結果其實就是上面message里面的內容。

@RestControllerAdvicepublic class ExceptionCatch { /** * 單個參數異常處理 * * @param ex * @return */ @ExceptionHandler(value = ConstraintViolationException.class) public Object constraintViolationException(ConstraintViolationException ex) { // 獲取具體的錯誤信息 Set<ConstraintViolation<?>> violations = ex.getConstraintViolations(); // 打印數據 violations.forEach(e -> System.out.println(e.getMessage()));return '單個-請求參數錯誤'; }}

JavaBean參數校驗(form-data)

JavaBean的寫法

@Data@NoArgsConstructor@AllArgsConstructorpublic class UserPO { @NotBlank(message = '用戶名不能為空') private String username; @NotNull(message = '年齡不能為空') @Min(value = 1, message = '年齡最小為1') @Max(value = 200, message = '年齡最大為200') private Integer age; @NotBlank(message = '性別不能為空') private String sex;}

Controller寫法

@RequestMapping(value = '/save/user')public Object saveUser(@Validated UserPO userPO) { // ... return 'SUCCESS';}

跟單一參數校驗不一樣的是JavaBean的校驗方式需要將@Validated寫在方法參數,而不是類上。如果出現了參數校驗不通過,同樣的也會拋出一個異常,BindException。

/** * 一般參數校驗綁定異常處理 * * @param ex * @return */@ExceptionHandler(value = BindException.class)public Object bindException(BindException ex) { BindingResult bindingResult = ex.getBindingResult(); // 獲取所有的錯誤信息 List<ObjectError> allErrors = bindingResult.getAllErrors(); // 輸出 allErrors.forEach(e -> System.out.println(e.getDefaultMessage())); return '請求參數錯誤';}

注意:大家要注意post請求有兩種方式,一種是基于form-data格式的數據傳遞,另外一種就是基于json格式的數據傳遞,兩種傳遞方式引發的異常也是不一樣的,所以我們還要單獨處理基于json的參數校驗異常處理。

JavaBean參數校驗(json)

我們先來看下Controller接收方式

@RequestMapping(value = '/save/user')public Object saveUser(@Validated @RequestBody UserPO userPO) { // ... return 'SUCCESS';}

對應的參數異常處理

/** * JSON參數校驗綁定異常處理 * * @param ex * @return */@ExceptionHandler(value = MethodArgumentNotValidException.class)public Object methodArgumentNotValidException(MethodArgumentNotValidException ex) { BindingResult bindingResult = ex.getBindingResult(); // 獲取所有的錯誤信息 List<ObjectError> allErrors = bindingResult.getAllErrors(); // 輸出 allErrors.forEach(e -> System.out.println(e.getDefaultMessage())); return '請求參數錯誤-json';}

最后的話

那么到這里,我們本篇文章就結束了,主要介紹了兩部分內容,異常的處理和參數的校驗。雖然很簡單,但是我個人感覺還是挺常用的技能。所以與大家進行分享,如果對你有點幫助,就來點個贊吧。如果有什么不明白的也歡迎下方留言,一起來交流。

到此這篇關于SpringBoot中的異常處理與參數校驗的方法實現的文章就介紹到這了,更多相關SpringBoot 異常處理與參數校驗內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
午夜在线一区| 国产精品男女| 国产91在线播放精品| 国产欧美日韩精品高清二区综合区| 亚洲另类视频| 日韩精品高清不卡| 日韩成人精品一区二区三区| 日本在线视频一区二区| 日韩中文字幕| 欧美精品影院| 国产精品115| 日韩1区2区| 福利一区和二区| 亚洲成人av观看| 欧美亚洲国产一区| 99国产精品视频免费观看一公开| 精品三级久久| 日韩视频一区| 亚洲一区二区三区四区电影| 日本午夜精品一区二区三区电影| 欧美日韩黄网站| 久久av导航| 98精品久久久久久久| 国产v综合v| 尤物在线精品| 三级久久三级久久久| 国产精品久久777777毛茸茸| 成人一二三区| 黄色国产精品| 日韩欧美中文在线观看| 国产精品一区二区三区www| 国产精品久久久久9999高清| 日韩av在线中文字幕| 久久精品国产www456c0m| 视频一区二区中文字幕| 国产精品视频一区二区三区综合| 国产suv精品一区二区四区视频 | 日韩精品国产精品| 欧美激情一区| 久久久久欧美精品| 亚洲欧美在线综合| 精品资源在线| 久久香蕉国产| 亚洲精品在线a| 精品国产亚洲一区二区三区在线 | 免费不卡在线观看| 日韩高清欧美激情| 91一区二区三区四区| 亚洲精品极品少妇16p| 日韩午夜视频在线| 精品丝袜久久| 亚洲欧洲日本mm| 国产精品一国产精品| 久久久人人人| 日韩高清在线一区| 日韩福利一区| 亚洲青青久久| 日韩精品诱惑一区?区三区| 蜜臀av一区二区在线免费观看| 国产精品1luya在线播放| 欧美日韩国产高清电影| 久久精品av麻豆的观看方式| 久久裸体视频| 国产精品九九| 国产毛片久久| 久久精品二区亚洲w码| 国产精品日韩| 国产白浆在线免费观看| 亚洲精品乱码| 在线日韩av| 欧美激情综合| 丝瓜av网站精品一区二区| 国产一区二区三区精品在线观看| 性色一区二区| 青青青免费在线视频| 日本麻豆一区二区三区视频| 亚洲特色特黄| 精品久久亚洲| 日韩精品91亚洲二区在线观看| 秋霞国产精品| 欧美1区二区| 亚洲tv在线| 亚洲精品2区| 日韩欧美一区二区三区免费看| 久久激情av| 免费看日韩精品| 黄色不卡一区| 国产+成+人+亚洲欧洲在线| 日本在线成人| 久久香蕉精品| 九九在线精品| 日韩高清不卡| 精品国产a一区二区三区v免费| 日韩精品亚洲专区| 美女精品网站| 午夜视频精品| 精品丝袜在线| www.九色在线| 国产精东传媒成人av电影| 中文字幕av一区二区三区四区| 欧美不卡视频| 亚洲啊v在线| 97精品国产福利一区二区三区| 国产精品xvideos88| 日韩av中文字幕一区| 首页亚洲欧美制服丝腿| 九九久久婷婷| 亚洲午夜久久久久久尤物| 麻豆视频在线观看免费网站黄| 麻豆一区二区99久久久久| 91成人精品观看| 亚洲一区二区三区无吗| 老司机精品久久| 亚洲综合欧美| 国产精品人人爽人人做我的可爱| 国产高清一区| 午夜免费一区| 亚洲精品午夜av福利久久蜜桃| 久久久久蜜桃| 婷婷精品视频| 欧美日韩精品一本二本三本| 欧美日韩亚洲在线观看| 久久天堂精品| 亚洲成人精品| 蜜桃视频欧美| 亚洲午夜视频| 91精品电影| 99视频一区| 天堂成人免费av电影一区 | 亚洲啊v在线免费视频| 日日夜夜免费精品视频| 日韩激情啪啪| 国产麻豆一区二区三区 | 日韩精品久久久久久久软件91| 亚洲精品观看| 91精品国产一区二区在线观看| 久久国产生活片100| 日韩三级精品| 久久超级碰碰| 成人午夜在线| 久久精品亚洲人成影院 | 午夜影院欧美| 日韩在线卡一卡二| 亚洲精品动态| 国产精品探花在线观看| 久久亚州av| 视频二区不卡| 亚洲精品1区2区| 四虎精品一区二区免费| 欧美日韩一区二区国产| 国产精品色在线网站| 精品日产乱码久久久久久仙踪林| 国产乱码午夜在线视频| 久久婷婷激情| 奶水喷射视频一区| 奇米亚洲欧美| 福利视频一区| 激情91久久| 日本aⅴ精品一区二区三区 | 久久激五月天综合精品| 久久免费福利| 国产综合色区在线观看| 亚洲精品午夜av福利久久蜜桃| 久久亚洲色图| 欧美国产极品| 亚洲二区精品| 日韩精品三级| 欧美亚洲日本精品| 免费久久99精品国产| 国产精品视频一区视频二区| www.51av欧美视频| 男女性色大片免费观看一区二区 | 亚洲另类黄色| 精品久久电影| 伊人久久婷婷| 国产亚洲电影| 午夜精品久久久久久久久久蜜桃| 国产美女精品| 美女视频黄久久| 欧美日韩国产传媒| 国产欧美69| 视频一区中文| 久久av中文| 国产免费成人| 国产经典一区| 快she精品国产999| 国产h片在线观看| 日韩精品91亚洲二区在线观看| av一区在线| 国产日产精品_国产精品毛片| 日韩在线观看一区| 亚洲欧洲国产精品一区| 日韩在线观看不卡| 国产乱码精品一区二区三区亚洲人| 91精品一区国产高清在线gif| 日本综合精品一区| 成人久久久久| 国产精品久久久久久久久久久久久久久| 激情综合自拍| 国产乱码精品一区二区三区四区 |