电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:2日期: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
相關文章:
主站蜘蛛池模板: 免联考国际MBA_在职MBA报考条件/科目/排名-MBA信息网 | 代做标书-代写标书-专业标书文件编辑-「深圳卓越创兴公司」 | 不锈钢螺丝 - 六角螺丝厂家 - 不锈钢紧固件 - 万千紧固件--紧固件一站式采购 | 自动钻孔机-全自动数控钻孔机生产厂家-多米(广东)智能装备有限公司 | 动物麻醉机-数显脑立体定位仪-北京易则佳科技有限公司 | 会议会展活动拍摄_年会庆典演出跟拍_摄影摄像直播-艾木传媒 | 水厂自动化-水厂控制系统-泵站自动化|控制系统-闸门自动化控制-济南华通中控科技有限公司 | 广州中央空调回收,二手中央空调回收,旧空调回收,制冷设备回收,冷气机组回收公司-广州益夫制冷设备回收公司 | 工业用品一站式采购平台|南创工品汇-官网|广州南创 | 济南玻璃安装_济南玻璃门_济南感应门_济南玻璃隔断_济南玻璃门维修_济南镜片安装_济南肯德基门_济南高隔间-济南凯轩鹏宇玻璃有限公司 | 无硅导热垫片-碳纤维导热垫片-导热相变材料厂家-东莞市盛元新材料科技有限公司 | 山东臭氧发生器,臭氧发生器厂家-山东瑞华环保设备 | 沈阳真空机_沈阳真空包装机_沈阳大米真空包装机-沈阳海鹞真空包装机械有限公司 | 防爆电机生产厂家,YBK3电动机,YBX3系列防爆电机,YBX4节防爆电机--河南省南洋防爆电机有限公司 | 大_小鼠elisa试剂盒-植物_人Elisa试剂盒-PCR荧光定量试剂盒-上海一研生物科技有限公司 | 泰来华顿液氮罐,美国MVE液氮罐,自增压液氮罐,定制液氮生物容器,进口杜瓦瓶-上海京灿精密机械有限公司 | 全自动烧卖机厂家_饺子机_烧麦机价格_小笼汤包机_宁波江北阜欣食品机械有限公司 | 电缆接头-防爆电缆接头-格兰头-金属电缆接头-防爆填料函 | 交联度测试仪-湿漏电流测试仪-双85恒温恒湿试验箱-常州市科迈实验仪器有限公司 | 依维柯自动挡房车,自行式国产改装房车,小型房车价格,中国十大房车品牌_南京拓锐斯特房车 - 南京拓锐斯特房车 | 聚氨酯保温钢管_聚氨酯直埋保温管道_聚氨酯发泡保温管厂家-沧州万荣防腐保温管道有限公司 | 数控走心机-双主轴走心机厂家-南京建克 | 楼承板-开闭口楼承板-无锡海逵楼承板 | 执业药师报名条件,考试时间,考试真题,报名入口—首页 | 压缩空气冷冻式干燥机_吸附式干燥机_吸干机_沪盛冷干机 | 不锈钢酒柜|恒温酒柜|酒柜定制|酒窖定制-上海啸瑞实业有限公司 | 好看的韩国漫画_韩漫在线免费阅读-汗汗漫画 | 压装机-卧式轴承轮轴数控伺服压装机厂家[铭泽机械] | Dataforth隔离信号调理模块-信号放大模块-加速度振动传感器-北京康泰电子有限公司 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 油缸定制-液压油缸厂家-无锡大鸿液压气动成套有限公司 | 深圳公司注册-工商注册代理-注册公司流程和费用_护航财税 | 大流量卧式砂磨机_强力分散机_双行星双动力混合机_同心双轴搅拌机-莱州市龙跃化工机械有限公司 | 有源电力滤波装置-电力有源滤波器-低压穿排电流互感器|安科瑞 | 双相钢_双相不锈钢_双相钢圆钢棒_双相不锈钢报价「海新双相钢」 双能x射线骨密度检测仪_dxa骨密度仪_双能x线骨密度仪_品牌厂家【品源医疗】 | 南京种植牙医院【官方挂号】_南京治疗种植牙医院那个好_南京看种植牙哪里好_南京茀莱堡口腔医院 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 油漆辅料厂家_阴阳脚线_艺术漆厂家_内外墙涂料施工_乳胶漆专用防霉腻子粉_轻质粉刷石膏-魔法涂涂 | 沙盘模型公司_沙盘模型制作公司_建筑模型公司_工业机械模型制作厂家 | 培训中心-翰香原香酥板栗饼加盟店总部-正宗板栗酥饼技术 | 长城人品牌官网| 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 |