欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java自定義注解驗證手機格式的實現示例

 更新時間:2021年03月05日 11:42:42   作者:菜-菜-菜  
這篇文章主要介紹了java自定義注解驗證手機格式的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

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

1.1 基本區(qū)別

@Valid:Hibernate validation校驗機制

@Validated:Spring Validator校驗機制,這個也是最常用的

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

1.2 作用范圍

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

1.3 分組校驗

@Validated:提供分組功能,可以在參數驗證時,根據不同的分組采用不同的驗證機制,注解中必須提供groups屬性,該屬性就是做分組的必要參數
@Valid:沒有分組功能

2、未使用分組校驗的示例

注解:

/**
 * 手機號驗證正則
 */
@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {PhoneValidator.class})// 指定約束處理器,也就是手機號格式驗證是哪個類來做校驗
public @interface Phone {

  String pattern() default "^(?:(?:\\+|00)86)?1\\d{10}$";

  String message() default "手機號格式非法";

  Class<?>[] groups() default { }; // groups用來指定分組,可以讓校驗采取不同的機制,當前默認未指定任何分組機制,默認每次都要進行校驗

  Class<? extends Payload>[] payload() default { };
  
  // 默認分組
  interface Default{

  }

  // 分組A
  interface A{

  }
}

格式校驗處理器:

/**
 * 校驗處理器:做手機號碼格式驗證的核心類
 */
public class PhoneValidator implements ConstraintValidator<Phone, String> {

  // 注解對象
  private Phone phone;

  // 初始化【Phone】對象
  @Override
  public void initialize(Phone constraintAnnotation) {
    phone = constraintAnnotation;
  }

  @Override
  public boolean isValid(String value, ConstraintValidatorContext context) {
    // 獲取【Phone】對象的手機格式驗證表達式
    String pattern = phone.pattern();
    Pattern compile = Pattern.compile(pattern);
    Matcher matcher = compile.matcher(value);
    return matcher.matches();
  }

作用類:

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class Person implements Serializable {
  
  @Phone
  private String phone;
}

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

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

以上示例未使用分組功能,因此每次都會校驗。

3、分組校驗的示例

使用分組校驗示示例時,先要看看@Validated注解,因為分組校驗就是配合該注解一起使用的,通過閱讀注釋就能理解到value屬性就是用來指定分組的:

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

}

因此我們需要改動的位置有兩處:

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

作用類:

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class Person implements Serializable {
  
  // 指定groups屬性
  @Phone(groups = {Phone.A.class})
  private String phone;

}

controller層:

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

此時請求中的校驗分組Phone.A.class和作用類中的校驗分組Phone.A.class一致,所以校驗會被執(zhí)行

到此這篇關于java自定義注解驗證手機格式的實現示例的文章就介紹到這了,更多相關java自定義注解驗證手機格式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MybatisPlus中@TableField注解的使用詳解

    MybatisPlus中@TableField注解的使用詳解

    這篇文章主要介紹了MybatisPlus中@TableField注解的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Java實現窗體程序顯示日歷

    Java實現窗體程序顯示日歷

    這篇文章主要為大家詳細介紹了Java實現窗體程序顯示日歷,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • SpringMVC中的ConversionServiceExposingInterceptor工具類解析

    SpringMVC中的ConversionServiceExposingInterceptor工具類解析

    這篇文章主要介紹了SpringMVC中的ConversionServiceExposingInterceptor工具類解析,ConversionServiceExposingInterceptor是Spring MVC的一個HandlerInterceptor,用于向請求添加一個屬性,需要的朋友可以參考下
    2023-12-12
  • Spring Boot實現qq郵箱驗證碼注冊和登錄驗證功能

    Spring Boot實現qq郵箱驗證碼注冊和登錄驗證功能

    這篇文章主要給大家介紹了關于Spring Boot實現qq郵箱驗證碼注冊和登錄驗證功能的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • JVM鉤子函數的使用場景詳解

    JVM鉤子函數的使用場景詳解

    當jvm進程退出的時候,或者受到了系統(tǒng)的中斷信號,hook線程就會啟動,一個線程可以注入多個鉤,下面這篇文章主要給大家介紹了關于JVM鉤子函數使用的相關資料,需要的朋友可以參考下
    2021-08-08
  • Spring中RedisTemplate使用方法詳解

    Spring中RedisTemplate使用方法詳解

    Spring封裝了一個比較強大的模板,也就是redisTemplate,方便在開發(fā)的時候操作Redis緩存,這篇文章主要給大家介紹了關于Java中RedisTemplate使用方法的相關資料,需要的朋友可以參考下
    2023-12-12
  • SpringBoot+JUnit5+MockMvc+Mockito單元測試的實現

    SpringBoot+JUnit5+MockMvc+Mockito單元測試的實現

    今天聊聊如何在 SpringBoot 中集成 Junit5、MockMvc、Mocktio。Junit5 是在 Java 棧中應用最廣的測試框架,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 基于java構造方法Vevtor添加元素源碼分析

    基于java構造方法Vevtor添加元素源碼分析

    這篇文章主要介紹了基于java構造方法中對Vevtor添加元素的源碼分析,有需要的朋友可以借鑒參考下,希望可以對大家有所幫助,祝大家早日升職加薪
    2021-09-09
  • Spring?ComponentScan的掃描過程解析

    Spring?ComponentScan的掃描過程解析

    這篇文章主要介紹了spring?ComponentScan的掃描過程解析,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • java實現微信小程序加密數據解密算法

    java實現微信小程序加密數據解密算法

    這篇文章主要為大家詳細介紹了java實現微信小程序加密數據解密算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09

最新評論