日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

详解BindingResult

發布時間:2023/12/16 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 详解BindingResult 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.前言

在開發電商等web應用時,難免要對前端傳來的參數進行校驗,如果大量的使用if else會增加代碼的復雜性,java提供了標準類庫,可以如下操作

public class CartAddForm {@NotNullprivate Integer productId;private Boolean selected = true; }

2.在controller層中校驗參數

在controller層中通過@Valid注解校驗前端的參數

@RestController public class CartController {@PostMapping("/carts")public ResponseVo<CartVo> add(@Valid @RequestBody CartAddForm cartAddForm) {return null;} }

3.參數校驗錯誤會導致什么

在postman中測試,參數CartForm設置為空,postman界面如下

提示用戶未登錄,這是攔截器的問題,將url加入到添加到白名單中

@Configuration public class InterceptorConfig implements WebMvcConfigurer {//將自己寫的攔截器注冊上去,然后配置對應的url@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new UserLoginInterceptor())//默認對所有接口攔截,除了登錄和注冊接口.addPathPatterns("/**").excludePathPatterns("/carts","/user/login", "/user/register","/categories","/products","/products/*");} }

測試后還是提示用戶未登錄,利用debug模式在preHandle處打個斷點,重新在postman中測試后斷點處數據如下

?

出現了url為"/error",這是因為前端傳來的數據校驗錯誤,spring把這個錯誤重定向到“/error”,然后這個地址被登錄攔截器攔截了,最終導致前端出現用戶未登錄的界面

4.BindingResult的使用

第一種方法,我們可以直接在controller中通過BindingResult類,然后根據這個校驗返回看是否有參數錯誤

//非空校驗if (bindingResult.hasErrors()) {log.error("注冊提交的參數有誤, {} {}",bindingResult.getFieldError().getDefaultMessage());return ResponseVo.error(PARAM_ERROR, bindingResult);}

第二種方法,當項目中多處出現參數校驗的時候,就可以使用統一異常處理,參數校驗錯誤后,會拋出一個MethodArgumentNotValidException異常,我們可以捕獲這個異常并處理

@ExceptionHandler(MethodArgumentNotValidException.class)@ResponseBodypublic ResponseVo notValidExceptionHandle(MethodArgumentNotValidException e) {BindingResult bindingResult = e.getBindingResult();Objects.requireNonNull(bindingResult.getFieldError());return ResponseVo.error(ResponseEnum.PARAM_ERROR,bindingResult.getFieldError().getField() + " " + bindingResult.getFieldError().getDefaultMessage());}

上述程序中,在異常處理的時候先通過異常類獲得了?BindingResult,然后先獲取到校驗錯誤的變量,隨后get到錯誤的信息,并返回給前臺。

總結

以上是生活随笔為你收集整理的详解BindingResult的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。