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

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

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

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - java自定義注解驗(yàn)證手機(jī)格式的實(shí)現(xiàn)示例

java自定義注解驗(yàn)證手機(jī)格式的實(shí)現(xiàn)示例

2021-08-20 11:06菜-菜-菜 Java教程

這篇文章主要介紹了java自定義注解驗(yàn)證手機(jī)格式的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1、@Valid與@Validated的區(qū)別

1.1 基本區(qū)別

@Valid:Hibernate validation校驗(yàn)機(jī)制

@Validated:Spring Validator校驗(yàn)機(jī)制,這個(gè)也是最常用的

@Validation只是對(duì)@Valid進(jìn)行了二次封裝,在使用上并沒(méi)有太大區(qū)別,但在分組、注解位置、嵌套驗(yàn)證等功能上有所不同

1.2 作用范圍

@Validated:用在類型、方法和方法參數(shù)上。但不能用于成員屬性(field)
@Valid:可以用在方法、構(gòu)造函數(shù)、方法參數(shù)和成員屬性(field)上

1.3 分組校驗(yàn)

@Validated:提供分組功能,可以在參數(shù)驗(yàn)證時(shí),根據(jù)不同的分組采用不同的驗(yàn)證機(jī)制,注解中必須提供groups屬性,該屬性就是做分組的必要參數(shù)
@Valid:沒(méi)有分組功能

2、未使用分組校驗(yàn)的示例

注解:

?
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
/**
 * 手機(jī)號(hào)驗(yàn)證正則
 */
@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {PhoneValidator.class})// 指定約束處理器,也就是手機(jī)號(hào)格式驗(yàn)證是哪個(gè)類來(lái)做校驗(yàn)
public @interface Phone {
 
  String pattern() default "^(?:(?:\\+|00)86)?1\\d{10}$";
 
  String message() default "手機(jī)號(hào)格式非法";
 
  Class<?>[] groups() default { }; // groups用來(lái)指定分組,可以讓校驗(yàn)采取不同的機(jī)制,當(dāng)前默認(rèn)未指定任何分組機(jī)制,默認(rèn)每次都要進(jìn)行校驗(yàn)
 
  Class<? extends Payload>[] payload() default { };
  
  // 默認(rèn)分組
  interface Default{
 
  }
 
  // 分組A
  interface A{
 
  }
}

格式校驗(yàn)處理器:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 * 校驗(yàn)處理器:做手機(jī)號(hào)碼格式驗(yàn)證的核心類
 */
public class PhoneValidator implements ConstraintValidator<Phone, String> {
 
  // 注解對(duì)象
  private Phone phone;
 
  // 初始化【Phone】對(duì)象
  @Override
  public void initialize(Phone constraintAnnotation) {
    phone = constraintAnnotation;
  }
 
  @Override
  public boolean isValid(String value, ConstraintValidatorContext context) {
    // 獲取【Phone】對(duì)象的手機(jī)格式驗(yàn)證表達(dá)式
    String pattern = phone.pattern();
    Pattern compile = Pattern.compile(pattern);
    Matcher matcher = compile.matcher(value);
    return matcher.matches();
  }

作用類:

?
1
2
3
4
5
6
7
8
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class Person implements Serializable {
  
  @Phone
  private String phone;
}

注意:只有在spring或者springboot項(xiàng)目中才能使用,直接調(diào)用方法不會(huì)有任何效果,使用注解進(jìn)行對(duì)象的屬性格式校驗(yàn)時(shí),必須配合@Validated一起使用(不一起使用,格式校驗(yàn)注解將會(huì)無(wú)效),正確操作如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
@RestController
@RequestMapping("/admin/")
public class PersonController {
 
  @Autowired
  private PersonService personService;
 
  @PostMapping("/query")
  public Person query(@RequestBody @Validated Person params) {
    return JsonResult.success(personService.queryByPhone(params));
  }
}

以上示例未使用分組功能,因此每次都會(huì)校驗(yàn)。

3、分組校驗(yàn)的示例

使用分組校驗(yàn)示示例時(shí),先要看看@Validated注解,因?yàn)榉纸M校驗(yàn)就是配合該注解一起使用的,通過(guò)閱讀注釋就能理解到value屬性就是用來(lái)指定分組的:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Validated {
 
 /**
 * Specify one or more validation groups to apply to the validation step
 * kicked off by this annotation.
 * <p>JSR-303 defines validation groups as custom annotations which an application declares
 * for the sole purpose of using them as type-safe group arguments, as implemented in
 * {@link org.springframework.validation.beanvalidation.SpringValidatorAdapter}.
 * <p>Other {@link org.springframework.validation.SmartValidator} implementations may
 * support class arguments in other ways as well.
 */
 Class<?>[] value() default {};
 
}

因此我們需要改動(dòng)的位置有兩處:

  • 首先是注解的作用類,注解上指定groups屬性
  • 其次是controller中的請(qǐng)求的形參:在請(qǐng)求中形參的@Validated指定value值,也就是指定校驗(yàn)生效的分組,如果請(qǐng)求中的分組類型【@Validated的value值】和作用類中注解所指定的分組【@Phone中的groups屬性的值】一致時(shí),才會(huì)進(jìn)行校驗(yàn),否則不會(huì)執(zhí)行校驗(yàn)

作用類:

?
1
2
3
4
5
6
7
8
9
10
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class Person implements Serializable {
  
  // 指定groups屬性
  @Phone(groups = {Phone.A.class})
  private String phone;
 
}

controller層:

?
1
2
3
4
5
6
7
8
9
10
11
12
@RestController
@RequestMapping("/admin/")
public class PersonController {
 
  @Autowired
  private PersonService personService;
 
  @PostMapping("/query")
  public Person query(@RequestBody @Validated(Phone.A.class) Person params) {
    return JsonResult.success(personService.queryByPhone(params));
  }
}

此時(shí)請(qǐng)求中的校驗(yàn)分組Phone.A.class和作用類中的校驗(yàn)分組Phone.A.class一致,所以校驗(yàn)會(huì)被執(zhí)行

到此這篇關(guān)于java自定義注解驗(yàn)證手機(jī)格式的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)java自定義注解驗(yàn)證手機(jī)格式內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://blog.csdn.net/qq_44309181/article/details/114300078

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 无人区尖叫之夜美女姐姐视频 | 亚洲精品无码不卡 | 青青草原国产视频 | 国产日产国无高清码2020 | a毛片久久免费观看 | 99青青青精品视频在线 | 国产在线播放一区 | 四虎成人免费大片在线 | 国产成人无精品久久久久国语 | 四虎tv| 亚洲精品影视 | 乌克兰黄色录像 | 国产成人福利美女观看视频 | 日韩一品在线播放视频一品免费 | 草莓视频深夜释放 | 色欲麻豆国产福利精品 | 三级午夜宅宅伦不卡在线 | 午夜亚洲视频 | 日本草草视频 | 99久久精品免费看国产高清 | 人人擦 | 亚洲伦理视频 | 久久国产精品二区99 | 亚洲AV久久无码精品九号 | 日本一区二区三区四区无限 | 99ri国产精品 | 女人c交zzzooo在线观看 | 2019年国产不卡在线刷新 | 精品午夜久久网成年网 | 欧美一级裸片又黄又裸 | 韩国三级 720p | 免费日本在线视频 | 国产一级片免费观看 | 亚洲精品国产精品精 | 国产极品麻豆91在线 | 日韩欧美一区二区三区免费看 | 性夜影院午夜看片 | 91国内精品久久久久怡红院 | 风间由美被义子中文字幕 | 99爱在线| 国产欧美日韩在线观看精品 |