激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

服務(wù)器之家 - 編程語言 - Java教程 - JAVA中通過自定義注解進(jìn)行數(shù)據(jù)驗證的方法

JAVA中通過自定義注解進(jìn)行數(shù)據(jù)驗證的方法

2021-05-25 13:13Decouple Java教程

java 自定義注解驗證可自己添加所需要的注解,下面這篇文章主要給大家介紹了關(guān)于JAVA中通過自定義注解進(jìn)行數(shù)據(jù)驗證的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

最近為了工作也為了更加深入了解掌握java注解的使用,決定自定義注解來實現(xiàn)數(shù)據(jù)驗證。

api開發(fā)中經(jīng)常會遇到一些對請求數(shù)據(jù)進(jìn)行驗證的情況,這時候如果使用注解就有兩個好處,一是驗證邏輯和業(yè)務(wù)邏輯分離,代碼清晰,二是驗證邏輯可以輕松復(fù)用,只需要在要驗證的地方加上注解就可以。

java提供了一些基本的驗證注解,比如@notnull、@size,但是更多情況下需要自定義驗證邏輯,這時候就可以自己實現(xiàn)一個驗證注解,方法很簡單,僅需要兩個東西:

  • 一個自定義的注解,并且指定驗證器
  • 一個驗證器的實現(xiàn)

自定義驗證注解

考慮有一個api,接收一個student對象,并希望對象里的age域的值是奇數(shù),這時候就可以創(chuàng)建以下注解:

?
1
2
3
4
5
6
7
8
@target(elementtype.field)
@retention(retentionpolicy.runtime)
@constraint(validatedby = agevalidator.class)
public @interface odd {
string message() default "age must be odd";
class<?>[] groups() default {};
class<? extends payload>[] payload() default {};
}

其中:

  • @target指明這個注解要作用在什么地方,可以是對象、域、構(gòu)造器等,因為要作用在age域上,因此這里選擇field
  • @retention指明了注解的生命周期,可以有source(僅保存在源碼中,會被編譯器丟棄),class(在class文件中可用,會被vm丟棄)以及runtime(在運行期也被保留),這里選擇了生命周期最長的runtime
  • @constraint是最關(guān)鍵的,它表示這個注解是一個驗證注解,并且指定了一個實現(xiàn)驗證邏輯的驗證器
  • message()指明了驗證失敗后返回的消息,此方法為@constraint要求
  • groups()和payload()也為@constraint要求,可默認(rèn)為空,詳細(xì)用途可以查看@constraint文檔

創(chuàng)建驗證器

有了注解之后,就需要一個驗證器來實現(xiàn)驗證邏輯:

?
1
2
3
4
5
6
7
8
9
10
public class agevalidator implements constraintvalidator<odd,integer> {
@override
public void initialize(odd constraintannotation) {
}
 
@override
public boolean isvalid(integer age, constraintvalidatorcontext constraintvalidatorcontext) {
return age % 2 != 0;
}
}

其中:

  • 驗證器有兩個類型參數(shù),第一個是所屬的注解,第二個是注解作用地方的類型,這里因為作用在age上,因此這里用了integer
  • initialize()可以在驗證開始前調(diào)用注解里的方法,從而獲取到一些注解里的參數(shù),這里用不到
  • isvalid()就是判斷是否合法的地方

應(yīng)用注解

注解和驗證器創(chuàng)建好之后,就可以使用注解了:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class student {
@odd
private int age;
private string name;
 
public string getname() {
return name;
}
 
public void setname(string name) {
this.name = name;
}
 
public int getage() {
return age;
}
 
public void setage(int age) {
this.age = age;
}
}
?
1
2
3
4
5
6
7
@restcontroller
public class studentresource {
@postmapping("/student")
public string addstudent(@valid @requestbody student student) {
return "student created";
}
}

在需要啟用驗證的地方加上@valid注解,這時候如果請求里的student年齡不是奇數(shù),就會得到一個400響應(yīng):

?
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
{
"timestamp": "2018-08-15t17:01:44.598+0000",
"status": 400,
"error": "bad request",
"errors": [
{
"codes": [
"odd.student.age",
"odd.age",
"odd.int",
"odd"
],
"arguments": [
{
"codes": [
"student.age",
"age"
],
"arguments": null,
"defaultmessage": "age",
"code": "age"
}
],
"defaultmessage": "age must be odd",
"objectname": "student",
"field": "age",
"rejectedvalue": 12,
"bindingfailure": false,
"code": "odd"
}
],
"message": "validation failed for object='student'. error count: 1",
"path": "/student"
}

也可以手動來處理錯誤,加上一個bindingresult來接收驗證結(jié)果即可:

?
1
2
3
4
5
6
7
8
9
10
@restcontroller
public class studentresource {
@postmapping("/student")
public string addstudent(@valid @requestbody student student, bindingresult validateresult) {
if (validateresult.haserrors()) {
return validateresult.getallerrors().get(0).getdefaultmessage();
}
return "student created";
}
}

這時候如果驗證出錯,便只會返回一個狀態(tài)為200,內(nèi)容為age must be odd的響應(yīng)。

總結(jié)

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

原文鏈接:https://www.cnblogs.com/xz816111/p/9484902.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 在线播放免费播放av片 | 九九热视频免费在线观看 | 99这里有精品 | 国产1区视频 | 午夜精品小视频 | 538任你躁在线精品视频网站 | a视频在线免费观看 | 可以免费看的av | 国产精品7区 | 久久人人爽人人爽人人片av高清 | 日本视频免费观看 | 奶子吧naiziba.cc免费午夜片在线观看 | 视频一区二区精品 | 黄色免费电影网址 | 成人一级在线 | 亚洲aⅴ免费在线观看 | 污污的视频在线观看 | 欧美三级短视频 | 国产一区二区精品91 | 久久性生活免费视频 | 一级成人黄色片 | 精品在线观看一区二区 | 亚洲二区不卡 | 中文字幕一区久久 | 成年人精品视频 | 欧美成人精品一区二区男人小说 | 在线播放免费人成毛片乱码 | 色屁屁xxxxⅹ免费视频 | 久久久成人999亚洲区美女 | 国产91一区二区三区 | 一区二区三区四区五区中文字幕 | 亚洲一区在线观看视频 | 欧美亚洲综合网 | 天天舔天天插 | 精品国产91一区二区三区 | 在线中文字幕观看 | 黄色网战入口 | 黄色毛片一级视频 | 久久99国产精品免费网站 | 亚洲欧美成aⅴ人在线观看 免费看欧美黑人毛片 | 韩国精品久久久 |