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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

帮你少写一大半参数校验代码的小技巧

發布時間:2025/3/16 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 帮你少写一大半参数校验代码的小技巧 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

介紹

幾乎每個web網站都會對用戶提交的參數進行校驗,前端要做,后端也要做。防止用戶直接通過接口調用的方式來請求或保存數據,從而導致產生臟數據等其他嚴重的后果。

因為有些校驗的邏輯也很繁瑣,為了減輕開發者的負擔,Java發布了 JSR303/JSR-349數據校驗規范

JSR303 是一項標準,JSR-349 是其的升級版本,添加了一些新特性,他們規定一些校驗規范即校驗注解,如 @Null,@NotNull,@Pattern,他們位于 javax.validation.constraints 包下,只提供規范不提供實現。

而 hibernate validation 是對這個規范的實踐(不要將 hibernate 和數據庫 orm 框架聯系在一起),他提供了相應的實現,并增加了一些其他校驗注解,如 @Length,@Range 等等,他們位于 org.hibernate.validator.constraints 包下。

而萬能的 spring 為了給開發者提供便捷,對 hibernate validation 進行了二次封裝,顯示校驗 validated bean 時,你可以使用 spring validation 或者 hibernate validation,而 spring validation 另一個特性,便是其在 springmvc 模塊中添加了自動校驗,并將校驗信息封裝進了特定的類中。這無疑便捷了我們的 web 開發

在spring boot項目中只要加入如下依賴即可使用校驗注解

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency>

查看子依賴會發現有如下依賴

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId> </dependency>

JSR提供的部分校驗注解如下

注解解釋
@Null被注釋的元素必須為 null
@NotNull被注釋的元素必須不為 null
@AssertTrue被注釋的元素必須為 true
@AssertFalse被注釋的元素必須為 false
@Min被注釋的元素必須是一個數字,其值必須大于等于指定的最小值
@Max被注釋的元素必須是一個數字,其值必須小于等于指定的最大值
@Pattern被注釋的元素必須符合指定的正則表達式
@Email被注釋的元素必須是電子郵箱地址

經常被搞混的3個注解

注解解釋
@NotNull不能為null,但可以為empty
@NotEmpty不能為null,而且長度必須大于0
@NotBlank只能作用在String上,不能為null,而且調用trim()后,長度必須大于0

我來舉一個org.apache.commons.lang3.StringUtils中的例子,你就能理解NotBlank的意思了,如下斷言都能測試通過

assertEquals(true,?StringUtils.isBlank(null)); assertEquals(true,?StringUtils.isBlank("")); //?空格 assertEquals(true,?StringUtils.isBlank("?")); //?回車 assertEquals(true,?StringUtils.isBlank("????"));

改造一個注冊的接口

先定義一下狀態枚舉類

public?enum?ResponseCode?{SUCCESS(0,?"成功"),ERROR(1,?"失敗"),ILLEGAL_ARGUMENT(2,?"參數錯誤"),EMPTY_RESULT(3,?"結果為空"),NEED_LOGIN(10,?"需要登錄");private?final?int?code;private?final?String?desc;ResponseCode(int?code,?String?desc)?{this.code?=?code;this.desc?=?desc;}public?int?getCode()?{return?code;}public?String?getDesc()?{return?desc;} }

定義項目的返回對象

@Data /**?注解的作用是序列化json時,如果是null對象,key也會消失?*/ @JsonInclude(JsonInclude.Include.NON_NULL) public?class?ServerResponse?implements?Serializable?{/**?狀態值?**/private?int?status;/**?描述?**/private?String?msg;/**?數據?**/private?Object?data;public?ServerResponse(int?status,?String?msg)?{this.status?=?status;this.msg?=?msg;}public?static?ServerResponse?success()?{return?new?ServerResponse(ResponseCode.SUCCESS.getCode(),?ResponseCode.SUCCESS.getDesc());}public?static?ServerResponse?illegalArgument(String?msg)?{return?new?ServerResponse(ResponseCode.ILLEGAL_ARGUMENT.getCode(),?msg);} }

注冊接口,這里省略了一部分校驗

@RequestMapping("regist") public?ServerResponse?regist(@RequestParam("name")?String?name,@RequestParam("phone")?String?phone,@RequestParam("phone")?String?email)?{if?(StringUtils.isBlank(name))?{return?ServerResponse.illegalArgument("用戶名不能為空");}//?其他一堆校驗過程,調用servicereturn?ServerResponse.success(); }

當不滿足條件時返回如下

{"status":?2,"msg":?"用戶名不能為空" }

當參數較多,校驗的邏輯也越來越多,這時可以直接將前端傳過來參數直接轉為對象

@Data public?class?Student?{@NotBlank(message?=?"用戶名不能為空")private?String?name;@NotBlank(message?=?"手機號不能為空")@Pattern(regexp?=?"^1(3|4|5|7|8)\\d{9}$",?message?=?"手機號碼格式錯誤")private?String?phone;@NotBlank(message?=?"郵箱不能為空")@Email(message?=?"郵箱格式錯誤")private?String?email; }
@RequestMapping("regist") public?ServerResponse?regist(@Valid?Student?student,?BindingResult?bindingResult)?{if?(bindingResult.hasErrors())?{List<FieldError>?errorList?=?bindingResult.getFieldErrors();//?list不為空if?(CollectionUtils.isNotEmpty(errorList))?{return?ServerResponse.illegalArgument(errorList.get(0).getDefaultMessage());}}//?調用servicereturn?ServerResponse.success(); }

代碼將不滿足條件的字段的描述取一個出來返回,類似如下。當都滿足時才會返回成功

{"status":?2,"msg":?"用戶名不能為空" }

需要注意的地方如下

參數 Student 前需要加上@Valid或@Validated 注解(下文說這2個注解的區別),表明需要 spring 對其進行校驗,而校驗的信息會存放到其后的 BindingResult 中。注意,必須相鄰,如果有多個參數需要校驗,形式可以如下。foo(@Validated Student student, BindingResult studentBindingResult ,@Validated Bar bar, BindingResult barBindingResult); 即一個校驗類對應一個校驗結果。

@Validated比@Valid的功能更強大

@Validated比@Valid的功能更強大,主要體現在@Validated可以進行分組校驗和嵌套校驗。

假如我們還要求學生填寫父親和母親的名字(并且不能為空),而后端的設計中父親和母親的名字被放在另一個類Relation中,這就要求我們能進行嵌套校驗。

我們要做如下2個事情

@Data public?class?Student?{@NotBlank(message?=?"用戶名不能為空")private?String?name;@NotBlank(message?=?"手機號不能為空")@Pattern(regexp?=?"^1(3|4|5|7|8)\\d{9}$",?message?=?"手機號碼格式錯誤")private?String?phone;@NotBlank(message?=?"郵箱不能為空")@Email(message?=?"郵箱格式錯誤")private?String?email;@NotNull(message?=?"父母名字不能為空")@Validprivate?Relation?relation; }
@Data public?class?Relation?{@NotBlank(message?=?"父親的姓名不能為空")private?String?fatherName;@NotBlank(message?=?"父親的姓名不能為空")private?String?motherName; }

那Relation類的fatherName屬性如何被賦值呢?

xxxx?relation.fatherName=li&relation.motherName=liu

有道無術,術可成;有術無道,止于術

歡迎大家關注Java之道公眾號

好文章,我在看??

總結

以上是生活随笔為你收集整理的帮你少写一大半参数校验代码的小技巧的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 亚洲国产婷婷香蕉久久久久久99 | 亚洲特黄| 日韩小视频网站 | 中文字幕无线精品亚洲乱码一区 | 91大神一区二区 | 亚洲一区二区三区播放 | 网址在线观看你懂的 | 黑人巨大精品一区二区在线 | 中文字幕乱码人妻二区三区 | 久久国语精品 | 黑人玩弄人妻一区二区三区 | 懂色av中文一区二区三区天美 | 看全黄大色黄大片美女人 | 熟女性饥渴一区二区三区 | 色图色小说| 福利视频在线播放 | 欧美成人动态图 | 久久久成人av | 国产日韩欧美成人 | 免费黄色小视频 | 日韩一区二区三区不卡 | 中文字幕永久在线播放 | av色网站 | 99久久久无码国产精品 | 自拍偷拍第八页 | 1024在线视频 | 欧洲av一区 | 日韩欧美理论片 | 亚洲天堂影院在线观看 | 最新91视频 | av免费播放 | 日本强好片久久久久久aaa | 亚洲综合婷婷 | 国产一级片在线播放 | 国产成人精品一区二区三区视频 | 免费黄色一级 | 国产成人久久婷婷精品流白浆 | 黄色精品 | 国产毛片一区 | 欧美日韩在线视频免费播放 | 成年在线视频 | 亚洲女同一区二区 | 91丨porny丨成人蝌蚪 | 高清国产在线观看 | 欧美福利片在线观看 | 亚洲av无一区二区三区怡春院 | 国内精品国产三级国产aⅴ久 | 国久久久 | 麻豆精品av | 国产玖玖在线 | 国产尤物在线观看 | 午夜视频一区 | 人妻少妇精品视频一区二区三区 | 一区二区三区欧美在线 | 五月天伊人网 | 国产又粗又猛又爽又黄的视频在线观看动漫 | 亚洲最大福利网 | 91久久色 | 国产精品自拍在线观看 | 在线播放一区二区三区 | 亚州中文字幕 | 91avcom| 久久两性视频 | 国语对白永久免费 | h视频免费在线 | 亚洲视频在线观看网址 | 国产一区二区不卡在线 | www.日本色 | 一级片麻豆 | 婷婷激情综合 | 精品视频无码一区二区三区 | 神马久久午夜 | 日韩福利在线视频 | 夜色导航 | 国产精品16p | 日韩理论视频 | 久久久久久久久久久久电影 | 性――交――性――乱 | 天天干天天干天天 | 天干夜夜爽爽日日日日 | 久久久国产一区二区三区 | 极品一区 | 永久免费不卡在线观看黄网站 | 亚洲精品短视频 | 免费人成在线观看 | 激情成人av| 成人看片网站 | 日本三级456 | 欧美成人精品欧美一级 | 最新版天堂资源在线 | 男女性生活视频网站 | 疯狂做爰的爽文多肉小说王爷 | 69日本xxxxxxxx96 | 涩涩av| 成人国产精品一区二区 | 色狠狠一区二区 | 看一级黄色片 | 91精品国产欧美一区二区 | 国产精品久久久久久久无码 |