精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring Boot 參數(shù)校驗以及分組校驗的使用

開發(fā) 后端
Bean Validation是Java定義的一套基于注解的數(shù)據(jù)校驗規(guī)范,目前已經(jīng)從JSR 303的1.0版本升級到JSR 349的1.1版本,再到JSR 380的2.0版本(2.0完成于2017.08),已經(jīng)經(jīng)歷了三個版本 。本文基于validator的介紹資料,也結合自己在項目中的實際使用經(jīng)驗進行了總結,希望能幫到大家。

 [[417101]]

一 前言

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

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

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

1 什么是validator

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

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

二 注解介紹

1 validator內(nèi)置注解

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

三 使用

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

1 單參數(shù)校驗

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

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

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

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

2 對象參數(shù)校驗

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

  1. public Result addUser(@Validated UserAO userAo) {    // do something}public class UserAO {  @NotBlank  private String name;  @NotNull  private Integer age;    ……} 

注解分組

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

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

public interface UpdateAction {}
2)在參數(shù)類中需要校驗的屬性上,在注解中添加groups屬性:

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

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

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

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

對象嵌套

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

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

3 錯誤消息的捕獲

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

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

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

1)MissingServletRequestParameterException

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

2)ConstraintViolationException異常

  1. if(e instanceof ConstraintViolationException){  // 單個參數(shù)校驗異常  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異常

  1. if (e instanceof BindException){      // get請求的對象參數(shù)校驗異常      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;} 

  1. 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異常

  1. if (e instanceof MethodArgumentNotValidException){      // post請求的對象參數(shù)校驗異常      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;} 

 

責任編輯:梁菲 來源: 阿里云云棲號
相關推薦

2021-08-10 15:11:27

Spring Boot參數(shù)校驗

2022-11-10 07:53:54

Spring參數(shù)校驗

2025-05-27 07:07:29

2025-10-27 02:00:00

2024-08-06 11:17:58

SpringJSON數(shù)據(jù)

2021-10-22 14:50:23

Spring BootJava

2023-03-09 12:04:38

Spring文件校驗

2025-04-29 07:44:26

配置校驗機制

2022-12-30 08:49:41

SpringBoot@Validated

2023-03-16 08:23:33

2025-05-14 00:00:00

2022-04-21 09:59:53

Nest參數(shù)校驗

2023-03-28 08:07:12

2023-11-29 07:23:04

參數(shù)springboto

2024-06-19 10:04:15

ifC#代碼

2025-01-06 09:51:51

2023-09-27 08:14:56

2021-05-18 09:25:54

SpringBoot參數(shù)校驗

2020-09-27 11:35:16

Spring BootStarterJava

2022-05-03 10:43:43

SpringJava
點贊
收藏

51CTO技術棧公眾號

中文字幕永久在线视频| 天堂资源在线视频| 1区2区3区在线| 久久综合狠狠综合| 国产情人节一区| 全网免费在线播放视频入口 | 91精品国产高清久久久久久久久 | 久久久久久久久久国产| 久久国产精品影院| 麻豆一二三区精品蜜桃| 五月天欧美精品| 亚洲一区二区三区精品动漫| 性做久久久久久久久久| 久久看片网站| 色综合久久88| 在线观看免费小视频| 亚洲日本一区二区三区在线| 日本福利一区二区| 成人午夜免费在线视频| 第九色区av在线| 成人高清在线视频| 91九色视频导航| 国产成人无码一区二区在线播放| 亚洲精品成人影院| 亚洲美女久久久| 精产国品一区二区三区| 久久久人成影片一区二区三区在哪下载| 亚洲精品国产无天堂网2021| 美国av一区二区三区| 性一交一乱一透一a级| 蜜桃久久精品一区二区| 91精品国产一区| 欧美黑人精品一区二区不卡| 第一会所sis001亚洲| 日韩欧美在线网站| 成人日韩在线视频| 高清不卡亚洲| 欧美日韩性视频在线| av久久久久久| 国产在线观看av| 中文无字幕一区二区三区| 国产在线一区二| www.久久久久久| 精品中文字幕一区二区小辣椒| 5278欧美一区二区三区| 国产无码精品在线观看| 欧美一区91| 久久视频在线直播| 精品亚洲乱码一区二区| 精品久久久久久久| 亚洲乱码一区二区| 日韩精品卡通动漫网站| 三级小说欧洲区亚洲区| 精品少妇一区二区| 中文字幕18页| xxxx日韩| 亚洲а∨天堂久久精品喷水 | 99精品国产九九国产精品| 色综合久久综合网97色综合 | 亚洲国产精品久久久久久| 日本特黄在线观看| 精品国产三级| 日韩一级二级三级| 欧美乱妇15p| 在线观看av的网址| 在线观看a级片| 一二三区精品福利视频| 国产91沈先生在线播放| 欧美1—12sexvideos| 亚洲一区二区在线免费观看视频| 成年在线观看视频| 欧美黄色视屏| 欧美日韩国产精品一区| 黄色片视频在线播放| 992tv国产精品成人影院| 欧美吞精做爰啪啪高潮| 久久久精品高清| 视频在线一区| 亚洲精品国产精品国产自| 亚洲综合网在线观看| 北条麻妃国产九九九精品小说 | 欧美日韩国产在线观看| 国产av无码专区亚洲精品| 亚洲www免费| 欧美男生操女生| 欧美xxxxx少妇| 亚洲三级精品| 久久精品99国产精品酒店日本 | 国产精品s色| 性欧美视频videos6一9| jizz国产在线| 国产一区日韩二区欧美三区| 国内精品视频免费| 成人在线免费电影| 亚洲美女免费在线| 亚欧无线一线二线三线区别| 国产精品极品美女在线观看| 3d成人动漫网站| av鲁丝一区鲁丝二区鲁丝三区| 亚洲专区视频| 久久在精品线影院精品国产| 日韩欧美亚洲一区二区三区| 日韩国产高清影视| 亚洲aa在线观看| 欧美视频综合| 亚洲精品视频在线观看网站| 黄色av网址在线播放| 国产91欧美| 日韩精品视频免费专区在线播放 | 精品久久久免费| 在线观看免费av网址| 看全色黄大色大片免费久久久| 永久免费毛片在线播放不卡 | 91久久精品一区二区三| 麻豆传媒在线看| 国产精品亚洲片在线播放| 久久天天躁日日躁| www.久久视频| av电影天堂一区二区在线| 制服诱惑一区| 成人免费网站www网站高清| 亚洲成av人乱码色午夜| 99热6这里只有精品| 久久九九免费| 久久精品国产美女| 四季久久免费一区二区三区四区| 欧美三区在线视频| 性欧美成人播放77777| 极品少妇一区二区三区| 成人欧美一区二区三区在线湿哒哒| 亚洲人妻一区二区| 亚洲福中文字幕伊人影院| aaaaaaaa毛片| 91日韩在线| 国产精品亚洲精品| 国产视频第一页在线观看| 天天综合网 天天综合色| 国产无套精品一区二区三区| 天天色天天射综合网| 国产精品成人v| 麻豆国产在线播放| 日韩欧美在线观看| 亚洲狠狠婷婷综合久久久久图片| 欧美日韩一区二区国产| 91香蕉视频在线下载| а天堂中文在线官网| 4hu四虎永久在线影院成人| 成年人免费视频播放| 蜜臀久久久久久久| 亚洲蜜桃av| 免费成人黄色网| 最新91在线视频| 影音先锋黄色网址| 国产精品天美传媒| 91插插插插插插插插| 狠狠色丁香婷婷综合影院| 国产激情久久久久| jyzzz在线观看视频| 在线免费观看日本一区| 三区四区在线观看| 久久99这里只有精品| 一本一生久久a久久精品综合蜜 | 日韩高清欧美激情| 日韩欧美电影一区二区| 日韩一区二区三区免费视频| 国产亚洲在线播放| 亚洲图片中文字幕| 亚洲男人天堂一区| 国产麻豆剧传媒精品国产| 国产一区二区三区自拍| 国产一区免费在线| 成人动漫一区| 中文字幕亚洲专区| www.香蕉视频| 亚欧色一区w666天堂| 蜜桃精品成人影片| 日韩vs国产vs欧美| 宅男在线精品国产免费观看| 日韩三级精品| 欧美野外猛男的大粗鳮| 国产中文字幕在线播放| 欧美日韩亚洲丝袜制服| 久草福利资源在线观看| 91麻豆精品在线观看| 国产又大又黄又粗又爽| 欧美在线免费一级片| 精品国产乱码久久久久久蜜柚| 朝桐光一区二区| 久久亚洲精品小早川怜子66| 蜜臀久久久久久999| 色哟哟精品一区| 综合五月激情网| 99精品视频在线观看| 午夜在线观看av| 亚洲私拍自拍| 午夜精品区一区二区三| 亚洲精品一二三**| 欧美整片在线观看| free性欧美hd另类精品| 亚洲欧美激情四射在线日| 国产精品毛片一区二区在线看舒淇| 亚洲va国产天堂va久久en| 六月婷婷七月丁香| 国产91精品一区二区麻豆网站| 乱子伦视频在线看| 国内精品99| 深田咏美在线x99av| 亚洲91网站| 国产精品久久久久免费a∨| 国产盗摄一区二区| 色婷婷综合成人| 天堂av网在线| 欧美大片一区二区三区| 影音先锋国产在线| 欧美日韩激情网| 国产人妻精品一区二区三区不卡| 久久久久青草大香线综合精品| 亚洲国产日韩在线一区| 全部av―极品视觉盛宴亚洲| 日韩国产欧美亚洲| 欧美涩涩网站| 免费久久久久久| 欧美在线免费看视频| 久久精品日韩| 粉嫩精品导航导航| 91久久精品国产91久久性色| 成人va天堂| 91禁国产网站| 97人澡人人添人人爽欧美| 欧美wwwxxxx| 免费在线看a| 中文字幕日韩精品在线| 黄网在线观看| 国产偷国产偷亚洲清高网站 | 亚洲午夜未删减在线观看 | 这里只有精品在线播放| 天堂av电影在线观看| 精品国产三级电影在线观看| 国产精品久久久久久久久毛片| 欧洲激情一区二区| 日本黄色中文字幕| 日本精品视频一区二区| 中文字幕精品无码一区二区| 五月天一区二区| 中文字幕一区二区三区精品| 亚洲午夜久久久久久久久电影网 | 中文字幕被公侵犯的漂亮人妻| av亚洲精华国产精华精| 中文字幕一区二区三区乱码不卡| 国产精品一区在线观看你懂的| 午夜大片在线观看| 精油按摩中文字幕久久| 亚洲色图 在线视频| 日本免费在线视频不卡一不卡二 | 日本少妇性高潮| 亚洲午夜在线视频| 日本一区二区不卡在线| 午夜不卡在线视频| 手机看片久久久| 色哟哟国产精品| 婷婷久久青草热一区二区| 日韩精品成人免费观看视频| 亚洲男女毛片无遮挡| 91 在线视频| 一区二区三区在线观看欧美 | 一区二区久久久久| 久久久久久久中文字幕| 亚洲已满18点击进入久久| 日韩乱码人妻无码中文字幕| 精品福利在线视频| 无码人妻精品一区二区三区不卡| 欧美中文字幕一二三区视频| 亚洲天堂男人网| 日韩三级精品电影久久久| 六月婷婷综合网| 亚洲男人天堂2019| 中文字幕在线观看日本| 久久成人这里只有精品| 678在线观看视频| 国产97在线播放| 亚洲伦理网站| 精品国产电影| 久久一级电影| 草b视频在线观看| 日韩中文字幕区一区有砖一区| 中文字幕av不卡在线| 国产成人自拍在线| 自拍偷拍亚洲天堂| 亚洲免费观看高清完整版在线观看熊 | 中文字幕乱码亚洲精品一区| 青青草原在线免费观看| 性欧美疯狂xxxxbbbb| 免费在线不卡av| 精品国产人成亚洲区| www.av在线播放| 午夜精品久久久久久久男人的天堂| 久久久成人av毛片免费观看| 91九色对白| 精品国产91| 精品少妇人欧美激情在线观看| 免费人成在线不卡| 成人在线视频免费播放| 中文字幕欧美一| 草莓视频18免费观看| 日韩欧美综合一区| 午夜免费视频在线国产| 欧美亚洲另类制服自拍| 日本精品视频| 天堂va久久久噜噜噜久久va| 国产精品s色| 在线观看岛国av| 91视频一区二区三区| 欧美精品videos极品| 精品视频免费在线| 日本护士...精品国| 欧美日韩第一视频| 亚洲久草在线| 亚洲高清不卡一区| 久久国产精品亚洲77777| 又色又爽又黄18网站| 亚洲三级小视频| 亚洲性在线观看| 中文综合在线观看| 成年美女黄网站色大片不卡| 国产视频一区二区不卡| 欧美激情1区2区3区| 激情在线观看视频| 国产精品久久久久久妇女6080| 亚洲欧美偷拍视频| 亚洲第一福利视频| 黄色美女视频在线观看| 精品国产乱码久久久久久图片 | 亚洲一区二区三区视频在线| 国产91精品看黄网站在线观看| 亚洲成人精品视频在线观看| 色黄网站在线观看| 国产精品入口尤物| 久久99视频| 日韩av一二三四区| 国产成人精品aa毛片| 亚洲av鲁丝一区二区三区| 欧美日韩国产123区| 国产精品久久久久久久龚玥菲 | 神马国产精品影院av| 日韩伦理三区| 欧美精品成人一区二区在线观看| 99精品国产在热久久婷婷| 亚洲激情 欧美| 欧美日韩一区二区精品| 无码国产精品一区二区色情男同| 久久久最新网址| 国产精品网在线观看| 蜜臀av色欲a片无码精品一区| 粉嫩蜜臀av国产精品网站| 国产精品99re| 亚洲成人精品视频| 精精国产xxxx视频在线播放| 精品久久精品久久| 毛片一区二区| 蜜桃av免费观看| 制服丝袜av成人在线看| 国产激情视频在线| 99久久国产免费免费| 亚洲精品1区2区| 中文精品在线观看| 欧美日韩中文字幕一区| sm国产在线调教视频| 国产精品久久精品国产| 免费亚洲婷婷| 色噜噜噜噜噜噜| 日韩一区二区精品葵司在线| 最新av在线播放| 精品国产日本| 奇米影视7777精品一区二区| 国产精品三区在线观看| 亚洲成在人线av| 日韩中文视频| 日韩精品免费一区| 91亚洲资源网| 一级爱爱免费视频| 久久久久五月天| av亚洲免费| 亚洲成人av免费观看| 欧美天堂在线观看| 日本三级在线播放完整版| 国产精品一 二 三| 日本不卡123| 青娱乐国产精品| 亚洲欧洲在线播放| 欧美电影院免费观看| 国产午夜福利视频在线观看| 国产精品欧美综合在线| 高清乱码毛片入口| 国产精品久久久91| 一区视频在线看| 少妇的滋味中文字幕bd| 精品久久免费看| 日韩免费在线电影| 日韩黄色片视频| 一区二区三区小说|