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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Boot参数校验以及分组校验的使用

發布時間:2024/9/3 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Boot参数校验以及分组校验的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡介:做web開發基本上每個接口都要對參數進行校驗,如果參數比較少,還比較容易處理,一但參數比較多了的話代碼中就會出現大量的if-else語句。雖然這種方式簡單直接,但會大大降低開發效率和代碼可讀性。所以我們可以使用validator組件來代替我們進行不必要的coding操作。本文將基于validator的介紹資料,同時結合作者自己在項目中的實際使用經驗進行了總結。

作者 | 江巖
來源 | 阿里技術公眾號

一 前言

做web開發有一點很煩人就是要對前端輸入參數進行校驗,基本上每個接口都要對參數進行校驗,比如一些非空校驗、格式校驗等。如果參數比較少的話還是容易處理的一但參數比較多了的話代碼中就會出現大量的if-else語句。

使用這種方式雖然簡單直接,但是也有不好的地方,一是降低了開發效率,因為我們需要校驗的參數會存在很多地方,并且不同地方會有重復校驗,其次降低了代碼可讀性,因為在業務代碼中摻雜了太多額外工作的代碼。

所以我們可以使用validator組件來代替我們進行不必要的coding操作。本文基于validator的介紹資料,也結合自己在項目中的實際使用經驗進行了總結,希望能幫到大家。

1 什么是validator

Bean Validation是Java定義的一套基于注解的數據校驗規范,目前已經從JSR 303的1.0版本升級到JSR 349的1.1版本,再到JSR 380的2.0版本(2.0完成于2017.08),已經經歷了三個版本 。需要注意的是,JSR只是一項標準,它規定了一些校驗注解的規范,但沒有實現,比如@Null、@NotNull、@Pattern等,它們位于 javax.validation.constraints這個包下。而hibernate validator是對這個規范的實現,并增加了一些其他校驗注解,如 @NotBlank、@NotEmpty、@Length等,它們位于org.hibernate.validator.constraints這個包下。

如果我們的項目使用了Spring Boot,hibernate validator框架已經集成在 spring-boot-starter-web中,所以無需再添加其他依賴。如果不是Spring Boot項目,需要添加如下依賴。

二 注解介紹

1 validator內置注解

hibernate validator中擴展定義了如下注解:

三 使用

使用起來比較簡單,都是使用注解方式使用。具體來說分為單參數校驗、對象參數校驗,單參數校驗就是controller接口按照單參數接收前端傳值,沒有封裝對象進行接收,如果有封裝對象那就是對象參數校驗。

1 單參數校驗

單參數校驗只需要在參數前添加注解即可,如下所示:

public Result deleteUser(@NotNull(message = "id不能為空") Long id) {// do something }

但有一點需要注意,如果使用單參數校驗,controller類上必須添加@Validated注解,如下所示:

@RestController @RequestMapping("/user") @Validated // 單參數校驗需要加的注解 public class UserController {// do something }

2 對象參數校驗

對象參數校驗使用時,需要先在對象的校驗屬性上添加注解,然后在Controller方法的對象參數前添加@Validated 注解,如下所示:

public Result addUser(@Validated UserAO userAo) {// do something }public class UserAO {@NotBlankprivate String name;@NotNullprivate Integer age;…… }

注解分組

在對象參數校驗場景下,有一種特殊場景,同一個參數對象在不同的場景下有不同的校驗規則。比如,在創建對象時不需要傳入id字段(id字段是主鍵,由系統生成,不由用戶指定),但是在修改對象時就必須要傳入id字段。在這樣的場景下就需要對注解進行分組。

1)組件有個默認分組Default.class, 所以我們可以再創建一個分組UpdateAction.class,如下所示:

public interface UpdateAction { }

2)在參數類中需要校驗的屬性上,在注解中添加groups屬性:

public class UserAO {@NotNull(groups = UpdateAction.class, message = "id不能為空")private Long id;@NotBlankprivate String name;@NotNullprivate Integer age;…… }

如上所示,就表示只在UpdateAction分組下校驗id字段,在默認情況下就會校驗name字段和age字段。

然后在controller的方法中,在@Validated注解里指定哪種場景即可,沒有指定就代表采用Default.class,采用其他分組就需要顯示指定。如下代碼便表示在addUser()接口中按照默認情況進行參數校驗,在updateUser()接口中按照默認情況和UpdateAction分組對參數進行共同校驗。

public Result addUser(@Validated UserAO userAo) {// do something } public Result updateUser(@Validated({Default.class, UpdateAction.class}) UserAO userAo) {// do something }

對象嵌套

如果需要校驗的參數對象中還嵌套有一個對象屬性,而該嵌套的對象屬性也需要校驗,那么就需要在該對象屬性上增加@Valid注解。

public class UserAO {@NotNull(groups = UpdateAction.class, message = "id不能為空")private Long id;@NotBlankprivate String name;@NotNullprivate Integer age;@Validprivate Phone phone;…… }public class Phone {@NotBlankprivate String operatorType;@NotBlankprivate String phoneNum; }

3 錯誤消息的捕獲

參數校驗失敗后會拋出異常,我們只需要在全局異常處理類中捕獲參數校驗的失敗異常,然后將錯誤消息添加到返回值中即可。捕獲異常的方法如下所示,返回值Result是我們系統自定義的返回值類。

@RestControllerAdvice(basePackages= {"com.alibaba.dc.controller","com.alibaba.dc.service"}) public class GlobalExceptionHandler {@ExceptionHandler(value = {Throwable.class})Result handleException(Throwable e, HttpServletRequest request){// 異常處理} }

需要注意的是,如果缺少參數拋出的異常是MissingServletRequestParameterException,單參數校驗失敗后拋出的異常是ConstraintViolationException,get請求的對象參數校驗失敗后拋出的異常是BindException,post請求的對象參數校驗失敗后拋出的異常是MethodArgumentNotValidException,不同異常對象的結構不同,對異常消息的提取方式也就不同。如下圖所示:

1)MissingServletRequestParameterException

if(e instanceof MissingServletRequestParameterException){Result result = Result.buildErrorResult(ErrorCodeEnum.PARAM_ILLEGAL);String msg = MessageFormat.format("缺少參數{0}", ((MissingServletRequestParameterException) e).getParameterName());result.setMessage(msg);return result; }

2)ConstraintViolationException異常

if(e instanceof ConstraintViolationException){// 單個參數校驗異常Result result = Result.buildErrorResult(ErrorCodeEnum.PARAM_ILLEGAL);Set<ConstraintViolation<?>> sets = ((ConstraintViolationException) e).getConstraintViolations();if(CollectionUtils.isNotEmpty(sets)){StringBuilder sb = new StringBuilder();sets.forEach(error -> {if (error instanceof FieldError) {sb.append(((FieldError)error).getField()).append(":");}sb.append(error.getMessage()).append(";");});String msg = sb.toString();msg = StringUtils.substring(msg, 0, msg.length() -1);result.setMessage(msg);}return result; }

3)BindException異常

if (e instanceof BindException){// get請求的對象參數校驗異常Result result = Result.buildErrorResult(ErrorCodeEnum.PARAM_ILLEGAL);List<ObjectError> errors = ((BindException) e).getBindingResult().getAllErrors();String msg = getValidExceptionMsg(errors);if (StringUtils.isNotBlank(msg)){result.setMessage(msg);}return result; } private String getValidExceptionMsg(List<ObjectError> errors) {if(CollectionUtils.isNotEmpty(errors)){StringBuilder sb = new StringBuilder();errors.forEach(error -> {if (error instanceof FieldError) {sb.append(((FieldError)error).getField()).append(":");}sb.append(error.getDefaultMessage()).append(";");});String msg = sb.toString();msg = StringUtils.substring(msg, 0, msg.length() -1);return msg;}return null; }

4)MethodArgumentNotValidException異常

if (e instanceof MethodArgumentNotValidException){// post請求的對象參數校驗異常Result result = Result.buildErrorResult(ErrorCodeEnum.PARAM_ILLEGAL);List<ObjectError> errors = ((MethodArgumentNotValidException) e).getBindingResult().getAllErrors();String msg = getValidExceptionMsg(errors);if (StringUtils.isNotBlank(msg)){result.setMessage(msg);}return result; }

《一站式大數據開發治理DataWorks使用寶典》官方電子書開放下載

DataWorks官方入門電子書出版啦,零基礎入門大數據開發治理,全面了解DataWorks十大功能模塊,快速上手DataWorks核心功能。

點擊這里,即可下載~

原文鏈接:https://developer.aliyun.com/article/786449?

版權聲明:本文內容由阿里云實名注冊用戶自發貢獻,版權歸原作者所有,阿里云開發者社區不擁有其著作權,亦不承擔相應法律責任。具體規則請查看《阿里云開發者社區用戶服務協議》和《阿里云開發者社區知識產權保護指引》。如果您發現本社區中有涉嫌抄襲的內容,填寫侵權投訴表單進行舉報,一經查實,本社區將立刻刪除涉嫌侵權內容。

總結

以上是生活随笔為你收集整理的Spring Boot参数校验以及分组校验的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

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