一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - Spring中校驗器(Validator)的深入講解

Spring中校驗器(Validator)的深入講解

2021-05-09 12:15Real_man Java教程

Spring校驗器,參數(shù)校驗從此簡單。下面這篇文章主要給大家介紹了關(guān)于Spring中校驗器(Validator)的相關(guān)資料,文中通過示例代碼介紹非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧

前言

spring框架的 validator 組件,是個輔助組件,在進行數(shù)據(jù)的完整性和有效性非常有用,通過定義一個某個驗證器,即可在其它需要的地方,使用即可,非常通用。

Spring中校驗器(Validator)的深入講解

應用在執(zhí)行業(yè)務邏輯之前,必須通過校驗保證接受到的輸入數(shù)據(jù)是合法正確的,但很多時候同樣的校驗出現(xiàn)了多次,在不同的層,不同的方法上,導致代碼冗余,浪費時間,違反dry原則。

  • 每一個控制器都要校驗
  • 過多的校驗參數(shù)會導致代碼太長
  • 代碼的復用率太差,同樣的代碼如果出現(xiàn)多次,在業(yè)務越來越復雜的情況下,維護成本呈指數(shù)上升。

可以考慮把校驗的代碼封裝起來,來解決出現(xiàn)的這些問題。

jsr-303

jsr-303是java為bean數(shù)據(jù)合法性校驗提供的標準框架,它定義了一套可標注在成員變量,屬性方法上的校驗注解。
hibernate validation提供了這套標準的實現(xiàn),在我們引入spring boot web starter或者spring boot starter validation的時候,默認會引入hibernate validation。

用法實例

說了這么多廢話,上代碼。

1、引入springboot項目

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<dependency>
 <groupid>org.springframework.boot</groupid>
 <artifactid>spring-boot-starter-web</artifactid>
</dependency>
<dependency>
 <groupid>org.hibernate.validator</groupid>
 <artifactid>hibernate-validator</artifactid>
</dependency>
<!-- 引入lomhok -->
<dependency>
 <groupid>org.projectlombok</groupid>
 <artifactid>lombok</artifactid>
</dependency>

2、編寫校驗對象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@data
public class user {
 // 名字不允許為空,并且名字的長度在2位到30位之間
 // 如果名字的長度校驗不通過,那么提示錯誤信息
 @notnull
 @size(min=2, max=30,message = "請檢查名字的長度是否有問題")
 private string name;
 
 // 不允許為空,并且年齡的最小值為18
 @notnull
 @min(18)
 private integer age;
}

3、創(chuàng)建控制器

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@springbootapplication
@restcontroller
public class userapplication{
 public static void main(string[] args) {
 springapplication.run(userapplication.class,args);
 }
 
 // 1. 要校驗的參數(shù)前,加上@valid注解
 // 2. 緊隨其后的,跟上一個bindingresult來存儲校驗信息
 @requestmapping("/test1")
 public object test1(
  @valid user user,
  bindingresult bindingresult
 ) {
 //如果檢驗出了問題,就返回錯誤信息
 // 這里我們返回的是全部的錯誤信息,實際中可根據(jù)bindingresult的方法根據(jù)需要返回自定義的信息。
 // 通常的解決方案為:jsr-303 + 全局exceptionhandler
 if (bindingresult.haserrors()){
  return bindingresult.getallerrors();
 }
 return "ok";
 }
}

4、運行應用

稍作演示下運行的結(jié)果,可以看出校驗框架已經(jīng)生效了。

Spring中校驗器(Validator)的深入講解
校驗年齡

Spring中校驗器(Validator)的深入講解

校驗名稱

Spring中校驗器(Validator)的深入講解

校驗通過

常見的校驗注解

@null 被注釋的元素必須為 null

@notnull 被注釋的元素必須不為 null

@asserttrue 被注釋的元素必須為 true

@assertfalse 被注釋的元素必須為 false

@min(value) 被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值

@max(value) 被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值

@decimalmin(value) 被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值

@decimalmax(value) 被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值

@size(max=, min=) 被注釋的元素的大小必須在指定的范圍內(nèi)

@digits (integer, fraction) 被注釋的元素必須是一個數(shù)字,其值必須在可接受的范圍內(nèi)

@past 被注釋的元素必須是一個過去的日期

@future 被注釋的元素必須是一個將來的日期

@pattern(regex=,flag=) 被注釋的元素必須符合指定的正則表達式

hibernate validator提供的校驗注解:

@notblank(message =) 驗證字符串非null,且長度必須大于0

@email 被注釋的元素必須是電子郵箱地址

@length(min=,max=) 被注釋的字符串的大小必須在指定的范圍內(nèi)

@notempty 被注釋的字符串的必須非空

@range(min=,max=,message=) 被注釋的元素必須在合適的范圍內(nèi)

自定義校驗注解

有時候,第三方庫中并沒有我們想要的校驗類型,好在系統(tǒng)提供了很好的擴展能力,我們可以自定義檢驗。
比如,我們想校驗用戶的手機格式,寫手機號碼校驗器

1、編寫校驗注解

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 我們可以直接拷貝系統(tǒng)內(nèi)的注解如@min,復制到我們新的注解中,然后根據(jù)需要修改。
@target({method, field, annotation_type, constructor, parameter})
@retention(runtime)
@documented
//注解的實現(xiàn)類。
@constraint(validatedby = {ismobilevalidator.class})
public @interface ismobile {
 //校驗錯誤的默認信息
 string message() default "手機號碼格式有問題";
 //是否強制校驗
 boolean isrequired() default false;
 class<?>[] groups() default {};
 class<? extends payload>[] payload() default {};
}

2、編寫具體的實現(xiàn)類

我們知道注解只是一個標記,真正的邏輯還要在特定的類中實現(xiàn),上一步的注解指定了實現(xiàn)校驗功能的類為ismobilevalidator。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 自定義注解一定要實現(xiàn)constraintvalidator接口奧,里面的兩個參數(shù)
// 第一個為 具體要校驗的注解
// 第二個為 校驗的參數(shù)類型
public class ismobilevalidator implements constraintvalidator<ismobile, string> {
 
 private boolean required = false;
 
 private static final pattern mobile_pattern = pattern.compile("1\\d{10}");
 //工具方法,判斷是否是手機號
 public static boolean ismobile(string src) {
  if (stringutils.isempty(src)) {
   return false;
  }
  matcher m = mobile_pattern.matcher(src);
  return m.matches();
 }
 
 @override
 public void initialize(ismobile constraintannotation) {
  required = constraintannotation.isrequired();
 }
 
 @override
 public boolean isvalid(string phone, constraintvalidatorcontext constraintvalidatorcontext) {
  //是否為手機號的實現(xiàn)
  if (required) {
   return ismobile(phone);
  } else {
   if (stringutils.isempty(phone)) {
    return true;
   } else {
    return ismobile(phone);
   }
  }
 }
}

3、測試自定義注解的功能

?
1
2
3
4
5
6
7
8
9
10
11
12
@data
public class user {
 @notnull
 @size(min=2, max=30,message = "請檢查名字的長度是否有問題")
 private string name;
 @notnull
 @min(18)
 private integer age;
 //這里是新添加的注解奧
 @ismobile
 private string phone;
}

4、測試

Spring中校驗器(Validator)的深入講解

通過

Spring中校驗器(Validator)的深入講解

手機號有問題

可以看出自定義的注解已經(jīng)生效了。

我們還可以繼續(xù)優(yōu)化的地方,新建一個全局的異常,如果校驗失敗的話,拋出全局的業(yè)務異常,捕獲業(yè)務異常,然后返回用戶友好的提示信息。

額外

也可以通過方法的校驗。

1、控制器上添加@validated注解

2、在控制器的方法上添加校驗注解,@min,@max等。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@validated
@restcontroller
@springbootapplication
public class userapplication{
 public static void main(string[] args) {
  springapplication.run(userapplication.class,args);
 }
 
 @requestmapping("/test2")
 public string test2(
   @ismobile string phone
 
 ){
  return phone + "ok";
 }
 
 @exceptionhandler(constraintviolationexception.class)
 @responsebody
 public object handleconstraintviolationexception(constraintviolationexception cve){
 
  hashset<string> messageset = new hashset();
  for (constraintviolation constraintviolation : cve.getconstraintviolations()) {
   messageset.add(constraintviolation.getmessage());
  }
  return messageset;
 }
}

Spring中校驗器(Validator)的深入講解

類的校驗規(guī)則

最后

通過使用校驗器,所有的控制器,我們都不用再去做校驗啦,代碼再回看是不是清爽很多。我們寫代碼很簡答,但是一定要想到如何把代碼寫的更簡單,更清晰,更利于維護,寫重復的代碼是在浪費自己的時間奧。

以后再碰到參數(shù)校驗的情況,首先想到的不是直接就去校驗,可以查找自己是否寫過某一類的驗證器,可以直接拿來即用。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:https://www.jianshu.com/p/2e6fd6d625cd

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 涩涩五月天 | 精品福利视频一区二区三区 | sese在线| 无毛黄片 | 国产黄频在线观看高清免费 | 国产精品国产高清国产专区 | 国产肥臀 | 亚洲AV综合99一二三四区 | 成人国产精品视频 | 国产欧美综合精品一区二区 | 色综合久久天天综合观看 | 四虎成人免费观看在线网址 | 亚洲日本aⅴ片在线观看香蕉 | 亚洲444777KKK在线观看 | 青草视频在线观看免费资源 | 91天堂在线| 成人免费淫片95视频观看网站 | 青青精品视频 | 男女做污事| 欧美春宫 | 亚洲AV 无码AV 中文字幕 | 不卡日本 | 973影院| 国产精品99久久 | 欧美xxoo做爰猛烈视频 | 99年水嫩漂亮粉嫩在线播放 | 亚洲成片在线看 | jzzjlzz亚洲乱熟在线播放 | 精品久久久久久亚洲精品 | 亚洲激情偷拍 | 美女草b| 亚洲成人免费看 | 国产福利在线观看第二区 | www.国产在线观看 | 午夜福到在线4国产 | 免费一区在线观看 | 9999热视频 | 久久精品WWW人人爽人人 | 小仙夜晚慰自催眠mp3护士篇 | 国产实拍会所女技师在线 | 免费在线观看亚洲 |