日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Spring-Validation 后端數(shù)據(jù)校驗(yàn)的實(shí)現(xiàn)

瀏覽:139日期:2023-08-28 10:28:44

前言

最近看到很多童鞋在項(xiàng)目中的對(duì)請(qǐng)求參數(shù)的校驗(yàn)都用的if來(lái)判斷各參數(shù)的屬性,如:

if(StringUtils.isBlank(username)){ return RR.exception('賬號(hào)不能為空');}if(StringUtils.isBlank(password)){ return RR.exception('密碼不能為空');}if(StringUtils.isBlank(realName)){ return RR.exception('姓名不能為空');}......

每個(gè)參數(shù)都需要這樣一個(gè)個(gè)去校驗(yàn)null,返回對(duì)應(yīng)信息,代碼就像疊羅漢一樣~~,在此,樓主強(qiáng)烈推薦一個(gè)神器:Validation,有了它,再也不用這樣去校驗(yàn)參數(shù)啦,可以讓我們?cè)陧?xiàng)目中不用太關(guān)注其他東西,專注于業(yè)務(wù)邏輯的編寫。

引入核心依賴

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

使用示例-添加用戶

需要校驗(yàn)的實(shí)體類,在此使用了一些常用的校驗(yàn)注解,基本上能夠見名知意,每個(gè)注解中都有message屬性,就是校驗(yàn)不通過(guò)后的提示信息

@Data@AllArgsConstructor@NoArgsConstructor@ApiModel(value = 'Account', description = '用戶實(shí)體類')public class Account implements Serializable { private static final long serialVersionUID = -6310331730721778951L; private Long id; @NotBlank(message = '用戶名不能為空') @Length(max = 10, message = '用戶名最長(zhǎng)為10位') private String name; @Pattern(regexp = PatternUtil.PASSWORDREGEX, message = '密碼為6-20位數(shù)字加字母組合') private String pwd; @NotBlank(message = '姓名不能為空') @Length(max = 8, message = '姓名最長(zhǎng)為8位') private String realName; @Pattern(regexp = PatternUtil.PHONENOREGEX, message = '手機(jī)號(hào)碼格式不正確') private String phone; @NotNull(message = '用戶性別不能為空') @Max(value = 1,message = '性別 0:男 1:女') @Min(value = 0,message = '性別 0:男 1:女') private Integer sex; @NotNull(message = '用戶狀態(tài)不能為空') @Max(value = 1,message = '用戶狀態(tài) 0:啟用 1:禁用') @Min(value = 0,message = '用戶狀態(tài) 0:啟用 1:禁用') private Integer status; @Length(max = 200, message = '備注最長(zhǎng)為200個(gè)字符') private String rmk;}

controller接口,注意在接收參數(shù)前需加上@Validated注解,這樣就會(huì)逐個(gè)去校驗(yàn)實(shí)體類中需要加了校驗(yàn)注解的的屬性,完全通過(guò)才進(jìn)入下一步業(yè)務(wù)處理,否則拋出MethodArgumentNotValidException異常,在這里我們直接將異常拋出,交給全局異常處理類來(lái)處理。

@SysLog(menu = '用戶管理', function = '添加',filterParams = {'pwd','password','salt'})@PermissionCheck('account:manager:add')@PostMapping(value = '/add', produces = BaseConsts.REQUEST_HEADERS_CONTENT_TYPE)@ApiOperation(value = '用戶管理-添加用戶接口', notes = '用戶管理-添加用戶接口', httpMethod = BaseConsts.REQUEST_METHOD, response = RR.class)public RR add(@Validated @RequestBody Account account) throws Exception { return RR.success('添加用戶成功');}

聲明全局異常處理類,處理所有異常,可以隨業(yè)務(wù)需要將異常種類細(xì)分,返回錯(cuò)誤碼,返回提示信息可自由定義... 這里只需關(guān)注MethodArgumentNotValidException異常。

@RestControllerAdvicepublic class GlobalExceptionHandle { /** * @param e * @return * @Description 未知異常處理 */ @ExceptionHandler(Exception.class) public RR handleException(Exception e) { e.printStackTrace(); return RR.exception('系統(tǒng)異常,請(qǐng)聯(lián)系管理員'); } /** * @param e * @return * @Description 請(qǐng)求參數(shù)異常 */ @ExceptionHandler(MethodArgumentNotValidException.class) public RR handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { return RR.exception('請(qǐng)求參數(shù)錯(cuò)誤:[' + e.getBindingResult().getFieldError().getDefaultMessage() + ']'); } /** * @param e * @return * @Description 系統(tǒng)業(yè)務(wù)服務(wù)異常 */ @ExceptionHandler(ServerException.class) public RR handleServerException(ServerException e) { return RR.exception(e.getMessage()); } /** * @param e * @return * @Description 令牌校驗(yàn)異常 */ @ExceptionHandler(ExpireException.class) public RR handleExpireException(ExpireException e) { return RR.expire(e.getMessage()); } /** * @param e * @return * @Description 無(wú)權(quán)訪問(wèn)異常 */ @ExceptionHandler(AccessDeniedException.class) public RR handleAccessDeniedException(AccessDeniedException e) { return RR.forbidden(e.getMessage()); } /** * @param e * @return * @Description 自定義重復(fù)操作異常 */ public RR handleRepeatHandleException(RepeatHandleException e) { return RR.exception('您的請(qǐng)求已發(fā)送,請(qǐng)勿重復(fù)操作!'); } /** * @param e * @return * @Description 登錄異常處理 */ @ExceptionHandler(AuthenticationException.class) public RR handleAuthenticationException(AuthenticationException e) { return RR.exception(e.getMessage()); }}

然后我們用Swagger來(lái)測(cè)試一下接口

1.用戶名為空

Spring-Validation 后端數(shù)據(jù)校驗(yàn)的實(shí)現(xiàn)

2.手機(jī)號(hào)格式錯(cuò)誤

Spring-Validation 后端數(shù)據(jù)校驗(yàn)的實(shí)現(xiàn)

通過(guò)返回結(jié)果可以看到,我們的校驗(yàn)注解已經(jīng)幫我們按照指定的校驗(yàn)方式校驗(yàn)了指定的字段屬性,我們?cè)诮y(tǒng)一的全局異常處理類中將提示信息封裝成需要的返回結(jié)果就可以了。

分組校驗(yàn)

有的童鞋在此可能有疑問(wèn)了,上述方法雖然可行,但我在新增用戶和修改用戶兩個(gè)接口中,新增用戶的用戶id是自動(dòng)生成的,無(wú)需校驗(yàn);修改用戶的用戶id是必傳的,則需校驗(yàn)。在此業(yè)務(wù)場(chǎng)景中,那豈不是需要聲明兩個(gè)實(shí)體類,但這兩個(gè)實(shí)體類中的屬性又大致相同,這不是增加麻煩嗎?其實(shí)不然,在此我們可以用到 groups 屬性來(lái)解決此場(chǎng)景下的問(wèn)題。

聲明分組

注意:在聲明分組的時(shí)候盡量加上 extend javax.validation.groups.Default 否則,在你聲明@Validated(Update.class)的時(shí)候,就會(huì)出現(xiàn)你在默認(rèn)沒添加groups = {}的時(shí)候的校驗(yàn)組@Email(message = '郵箱格式不對(duì)'),會(huì)不去校驗(yàn),因?yàn)槟J(rèn)的校驗(yàn)組是groups = {Default.class}。

/** * 數(shù)據(jù)新增分組 */public interface Create extends Default {}/** * 數(shù)據(jù)更新分組 */public interface Update extends Default {}

校驗(yàn)注解中添加分組,groups 為一個(gè)數(shù)組,可以添加多個(gè)分組

@NotNull(message = 'id不能為空' , groups = Update.class)private Long id;@NotBlank(message = '用戶名不能為空' , groups = {Create.class, Update.class})@Length(max = 10, message = '用戶名最長(zhǎng)為10位')private String name;

修改Controller中的@Validated注解,聲明校驗(yàn)分組

@PermissionCheck('account:manager:add')@PostMapping(value = '/add', produces = BaseConsts.REQUEST_HEADERS_CONTENT_TYPE)@ApiOperation(value = '用戶管理-添加用戶接口', notes = '用戶管理-添加用戶接口', httpMethod = BaseConsts.REQUEST_METHOD, response = RR.class)public RR add(@Validated(Create.class) @RequestBody Account account) throws Exception { return RR.success('添加用戶成功');}@PermissionCheck('account:manager:edit')@PostMapping(value = '/edit', produces = BaseConsts.REQUEST_HEADERS_CONTENT_TYPE)@ApiOperation(value = '用戶管理-修改用戶接口', notes = '用戶管理-修改用戶接口', httpMethod = BaseConsts.REQUEST_METHOD, response = RR.class)public RR edit(@Validated(Update.class) @RequestBody Account account) throws Exception { return RR.success('編輯用戶成功');}

使用相同的請(qǐng)求參數(shù)測(cè)試一下添加用戶和修改用戶的接口

測(cè)試添加接口

Spring-Validation 后端數(shù)據(jù)校驗(yàn)的實(shí)現(xiàn)

測(cè)試修改接口

Spring-Validation 后端數(shù)據(jù)校驗(yàn)的實(shí)現(xiàn)

通過(guò)接口的返回結(jié)果可以看到,新增用戶的接口并沒有校驗(yàn)id這個(gè)參數(shù)了,而修改用戶的接口中則校驗(yàn)了id不能為空。

常用校驗(yàn)注解

以上就是樓主在項(xiàng)目中使用validation的總結(jié)歸納,下面收集了一些常用注解,紅色的標(biāo)注則是樓主在項(xiàng)目中用的比較多的。

JSR提供的校驗(yàn)注解: @Null 被注釋的元素必須為 null @NotNull 被注釋的元素必須不為 null @AssertTrue 被注釋的元素必須為 true @AssertFalse 被注釋的元素必須為 false @Min(value) 被注釋的元素必須是一個(gè)數(shù)字,其值必須大于等于指定的最小值 @Max(value) 被注釋的元素必須是一個(gè)數(shù)字,其值必須小于等于指定的最大值 @DecimalMin(value) 被注釋的元素必須是一個(gè)數(shù)字,其值必須大于等于指定的最小值 @DecimalMax(value) 被注釋的元素必須是一個(gè)數(shù)字,其值必須小于等于指定的最大值 @Size(max=, min=) 被注釋的元素的大小必須在指定的范圍內(nèi) @Digits (integer, fraction) 被注釋的元素必須是一個(gè)數(shù)字,其值必須在可接受的范圍內(nèi) @Past 被注釋的元素必須是一個(gè)過(guò)去的日期 @Future 被注釋的元素必須是一個(gè)將來(lái)的日期 @Pattern(regex) 被注釋的元素必須符合指定的正則表達(dá)式

Hibernate Validator提供的校驗(yàn)注解: @NotBlank() 驗(yàn)證字符串非null且非空格,長(zhǎng)度必須大于0 @Email 被注釋的元素必須是電子郵箱地址 @Length(min=,max=) 被注釋的字符串的大小必須在指定的范圍內(nèi) @NotEmpty 被注釋的字符串的必須非空 @Range(min=,max=,message=) 被注釋的元素必須在合適的范圍內(nèi)

參考博文: https://www.jb51.net/article/157604.htm

到此這篇關(guān)于Spring-Validation 后端數(shù)據(jù)校驗(yàn)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Spring Validation數(shù)據(jù)校驗(yàn)內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲综合精品四区| 久久国产精品久久w女人spa| 日本在线一区二区三区| 亚洲一区日韩在线| 国产亚洲欧洲| 久久亚洲欧美| 亚洲精品乱码久久久久久蜜桃麻豆| 久久国产66| 免费精品视频| 久久国产精品久久w女人spa| 在线一区二区三区视频| 亚洲三级精品| 69堂免费精品视频在线播放| 一区二区国产在线观看| 亚洲精品字幕| 国产丝袜一区| 国产成人免费精品| 久久九九99| 国产美女一区| 日韩精品成人| 久久精品国产福利| 欧美不卡高清一区二区三区| 欧美大黑bbbbbbbbb在线| 视频一区欧美精品| 日韩不卡一区二区三区| 国产精品v一区二区三区| 精品国产a一区二区三区v免费| 国产v日韩v欧美v| jizzjizz中国精品麻豆| 婷婷激情图片久久| 亚洲精品亚洲人成在线观看| 国产美女视频一区二区| 国产传媒在线| 久久高清免费观看| 国产精品亚洲产品| 日韩av福利| 久色成人在线| 国产精品一线| 999久久久国产精品| 久久亚洲不卡| 老司机精品视频在线播放| 日韩在线中文| 亚洲日产av中文字幕| 国产精品久久亚洲不卡| se01亚洲视频| 一区二区三区四区在线观看国产日韩| 国产精品亚洲欧美日韩一区在线| 成人美女视频| 中文字幕中文字幕精品| 韩日一区二区| 亚洲欧美网站| 国内揄拍国内精品久久| 亚洲欧美视频一区二区三区| 欧美激情三区| 99亚洲视频| 美女久久久久久| 尹人成人综合网| 国产精品免费99久久久| 色婷婷久久久| 国产日韩中文在线中文字幕| 99精品美女| 国产精品天天看天天狠| 亚州av乱码久久精品蜜桃| 国产精品巨作av| 视频一区二区国产| 中文字幕在线视频久| 日韩欧美三区| 韩日一区二区三区| 精品72久久久久中文字幕| 亚洲深深色噜噜狠狠爱网站 | 老牛国内精品亚洲成av人片| 红桃视频国产精品| 国产一区调教| 婷婷视频一区二区三区| 久久精品中文| 麻豆精品av| 日韩精品一区二区三区免费视频 | 色婷婷成人网| 久久精品国产99久久| 久久丁香四色| 日本大胆欧美人术艺术动态| 日韩欧美精品一区| 日韩成人精品一区| 国产午夜精品一区二区三区欧美| 日韩欧美二区| 日韩大片免费观看| 91亚洲一区| 超碰在线99| 日韩成人综合| 国产精品字幕| 久久久夜夜夜| 成人精品天堂一区二区三区| 日韩欧美国产精品综合嫩v| 98精品久久久久久久| av资源新版天堂在线| 红杏一区二区三区| 97精品国产| 日韩网站中文字幕| 激情久久五月| 日韩av免费| 综合激情网站| 日韩av成人高清| 一区二区精彩视频| 夜夜嗨网站十八久久| 99成人在线视频| 99国产精品免费视频观看| 欧美国产另类| 国产精品啊v在线| 99在线观看免费视频精品观看| 婷婷成人在线| 欧美精品91| 久久激情综合网| 国产精品v日韩精品v欧美精品网站 | 99久久亚洲精品蜜臀| 99精品电影| 91精品福利| 日韩中文字幕1| 日韩精品亚洲专区在线观看| 国产日韩欧美三级| 国产精品v一区二区三区| 狠狠久久伊人| 日韩欧美另类一区二区| 日韩精品首页| 手机精品视频在线观看| 日韩一区二区三区高清在线观看| 国产欧美日韩视频在线| 日本午夜精品一区二区三区电影| 日韩1区2区日韩1区2区| 麻豆精品久久| 日韩伦理一区| 伊人久久大香线蕉av超碰演员| 一区二区国产在线观看| 国产精品久久久免费| 国产中文在线播放| 免费观看久久av| 亚洲欧美在线综合| 欧美日韩99| 日韩av片子| 亚洲一区二区动漫| 国产伦精品一区二区三区视频 | 亚洲激情社区| 欧美一区二区三区久久| 久久麻豆视频| 色婷婷狠狠五月综合天色拍| 噜噜噜久久亚洲精品国产品小说| 亚州精品视频| 精品亚洲成人| 欧美在线亚洲| 国产精品一区二区三区美女 | 日韩欧美少妇| 日本vs亚洲vs韩国一区三区二区| 久久伊人亚洲| 五月天综合网站| 国产女人18毛片水真多18精品| 美女网站视频一区| 日本欧美韩国一区三区| 成人看片网站| 91成人小视频| 国产一区二区中文| 国产欧美日韩在线一区二区 | 欧美一级网址| 亚洲手机视频| 国产精品美女久久久久久不卡| 欧美91精品| 91亚洲无吗| 91精品亚洲| 国产精品调教| 视频一区二区三区中文字幕| 国产在线一区不卡| 亚洲一区二区三区无吗| 国产一区二区三区视频在线| 丝瓜av网站精品一区二区| 国产精品久久久久蜜臀| 亚洲欧美久久精品| 日韩理论视频| 久久国产婷婷国产香蕉| 五月婷婷亚洲| 国产一区丝袜| 日韩美女精品| 久久影院一区| 麻豆国产91在线播放| 亚洲乱码视频| 精品一区亚洲| 国产精品久久久久蜜臀| 911亚洲精品| 久久午夜精品一区二区| 欧美成人基地| 久久久久97| 日韩av电影一区| 午夜一区在线| 999国产精品999久久久久久| 久久中文字幕一区二区三区| 亚洲不卡视频| 亚洲黄页一区| 日韩高清欧美| 嫩呦国产一区二区三区av| 亚洲欧洲日韩精品在线| 红桃视频国产精品| 久久五月天小说| 日韩一区二区在线免费|