最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

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

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

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

自定義驗(yàn)證注解

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

@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è)注解要作用在什么地方,可以是對(duì)象、域、構(gòu)造器等,因?yàn)橐饔迷赼ge域上,因此這里選擇FIELD
  • @Retention指明了注解的生命周期,可以有SOURCE(僅保存在源碼中,會(huì)被編譯器丟棄),CLASS(在class文件中可用,會(huì)被VM丟棄)以及RUNTIME(在運(yùn)行期也被保留),這里選擇了生命周期最長的RUNTIME
  • @Constraint是最關(guān)鍵的,它表示這個(gè)注解是一個(gè)驗(yàn)證注解,并且指定了一個(gè)實(shí)現(xiàn)驗(yàn)證邏輯的驗(yàn)證器
  • message()指明了驗(yàn)證失敗后返回的消息,此方法為@Constraint要求
  • groups()和payload()也為@Constraint要求,可默認(rèn)為空,詳細(xì)用途可以查看@Constraint文檔

創(chuàng)建驗(yàn)證器

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

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;
}
}

其中:

  • 驗(yàn)證器有兩個(gè)類型參數(shù),第一個(gè)是所屬的注解,第二個(gè)是注解作用地方的類型,這里因?yàn)樽饔迷赼ge上,因此這里用了Integer
  • initialize()可以在驗(yàn)證開始前調(diào)用注解里的方法,從而獲取到一些注解里的參數(shù),這里用不到
  • isValid()就是判斷是否合法的地方

應(yīng)用注解

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

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;
}
}
@RestController
public class StudentResource {
@PostMapping("/student")
public String addStudent(@Valid @RequestBody Student student) {
return "Student Created";
}
}

在需要啟用驗(yàn)證的地方加上@Valid注解,這時(shí)候如果請(qǐng)求里的Student年齡不是奇數(shù),就會(huì)得到一個(gè)400響應(yīng):

{
"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"
}

也可以手動(dòng)來處理錯(cuò)誤,加上一個(gè)BindingResult來接收驗(yàn)證結(jié)果即可:

@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";
}
}

這時(shí)候如果驗(yàn)證出錯(cuò),便只會(huì)返回一個(gè)狀態(tài)為200,內(nèi)容為Age Must Be Odd的響應(yīng)。

總結(jié)

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

相關(guān)文章

  • Spring聲明式事務(wù)配置使用詳解

    Spring聲明式事務(wù)配置使用詳解

    這篇文章主要介紹了在spring注解中,使用聲明式事務(wù),需要用到兩個(gè)核心的注解:@Transactional注解和@EnableTransactionManagement注解。將@Transactional注解加在方法上,@EnableTransactionManagement注解加在配置類上
    2022-08-08
  • Java8?Stream流多字段求和、匯聚的實(shí)例

    Java8?Stream流多字段求和、匯聚的實(shí)例

    這篇文章主要介紹了Java8?Stream流多字段求和、匯聚的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • BMIDE環(huán)境導(dǎo)入項(xiàng)目報(bào)編碼錯(cuò)誤解決方案

    BMIDE環(huán)境導(dǎo)入項(xiàng)目報(bào)編碼錯(cuò)誤解決方案

    這篇文章主要介紹了BMIDE環(huán)境導(dǎo)入項(xiàng)目報(bào)編碼錯(cuò)誤解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • java中Cookie被禁用后Session追蹤問題

    java中Cookie被禁用后Session追蹤問題

    這篇文章主要介紹了Java中Cookie被禁用后Session追蹤問題,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-03-03
  • MySQL實(shí)現(xiàn)遠(yuǎn)程登錄的方法

    MySQL實(shí)現(xiàn)遠(yuǎn)程登錄的方法

    Host 'Local' is not allowed to connect to this MySQL server 的解決方法,需要的朋友可以參考一下
    2013-03-03
  • 如何使用Java操作Zookeeper

    如何使用Java操作Zookeeper

    這篇文章主要介紹了如何使用Java操作Zookeeper,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-04-04
  • 微信小程序獲取手機(jī)號(hào),后端JAVA解密流程代碼

    微信小程序獲取手機(jī)號(hào),后端JAVA解密流程代碼

    這篇文章主要介紹了微信小程序獲取手機(jī)號(hào),后端JAVA解密流程的代碼,幫助大家更好的利用Java開發(fā),感興趣的朋友可以了解下
    2020-09-09
  • 關(guān)于Java變量的聲明、內(nèi)存分配及初始化詳解

    關(guān)于Java變量的聲明、內(nèi)存分配及初始化詳解

    下面小編就為大家?guī)硪黄P(guān)于Java變量的聲明、內(nèi)存分配及初始化詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • 詳解MyBatis配置typeAliases的方法

    詳解MyBatis配置typeAliases的方法

    這篇文章主要介紹了詳解MyBatis配置typeAliases的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • springboot整合solr的方法詳解

    springboot整合solr的方法詳解

    這篇文章主要介紹了springboot整合solr的方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08

最新評(píng)論

高要市| 临沧市| 平顶山市| 涿鹿县| 德州市| 万州区| 长海县| 武平县| 盐亭县| 偏关县| 抚顺县| 福安市| 石柱| 交口县| 沁水县| 中阳县| 安顺市| 翁源县| 孝昌县| 兴国县| 太湖县| 阿拉善盟| 凉山| 开封县| 济阳县| 满城县| 榆中县| 琼海市| 固镇县| 明星| 九龙县| 枣庄市| 固安县| 通江县| 柘城县| 黑龙江省| 万年县| 惠州市| 华蓥市| 仲巴县| 无为县|