当前位置: 首页 > 编程笔记 >

java自定义注解验证手机格式的实现示例

侯涵煦
2023-03-14
本文向大家介绍java自定义注解验证手机格式的实现示例,包括了java自定义注解验证手机格式的实现示例的使用技巧和注意事项,需要的朋友参考一下

1、@Valid与@Validated的区别

1.1 基本区别

@Valid:Hibernate validation校验机制

@Validated:Spring Validator校验机制,这个也是最常用的

@Validation只是对@Valid进行了二次封装,在使用上并没有太大区别,但在分组、注解位置、嵌套验证等功能上有所不同

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属性的值】一致时,才会进行校验,否则不会执行校验

作用类:

@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一致,所以校验会被执行

到此这篇关于java自定义注解验证手机格式的实现示例的文章就介绍到这了,更多相关java自定义注解验证手机格式内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 本文向大家介绍Hibernate Validation自定义注解校验的实现,包括了Hibernate Validation自定义注解校验的实现的使用技巧和注意事项,需要的朋友参考一下 情景:需要对String类型的属性比如description进行验证,验证规则是当description为空时不进行正则校验,description不为空时进行正则校验。上述需求Hibernate Validatio

  • 本文向大家介绍Android自定义View实现随机验证码,包括了Android自定义View实现随机验证码的使用技巧和注意事项,需要的朋友参考一下 对于android开发来说自定义View还是一个比较重要的技能,所以在这里写一篇自定义View入门的文章,也是实现一个相对简单的随机产生验证码的功能: 自定义View主要也就分为几步  1.自定义View的属性  2.在我们的自定义的布局中获取自定义属

  • 问题内容: 我有一个非常简单的表格: 这是自定义表单验证的完成方式吗?我需要评估该电子邮件地址当前没有用户存在。我还需要评估并匹配。我该怎么做呢? 问题答案: 要单独验证单个字段,可以在表单中使用clean_FIELDNAME()方法,因此对于电子邮件: 然后对于相互依赖的共同依赖字段,你可以覆盖在单独验证所有字段(email如上)之后运行的 方法: 我不确定你从哪里来,但是看起来这是为m你的表单

  • 本文向大家介绍Android自定义View实现验证码,包括了Android自定义View实现验证码的使用技巧和注意事项,需要的朋友参考一下 本文章是基于鸿洋的Android 自定义View (一) 的一些扩展,以及对Android自定义View构造函数详解里面内容的一些转载。 首先我们定义一个declare-styleable标签declare-styleable标签的作用是给自定义控件添加自定义

  • 前面我们学习了 Java 的基本注解和元注解,如果这两种注解不能满足你的需求,可以自定义注解。下面介绍如何自定义注解。 声明自定义注解使用 @interface 关键字(interface 关键字前加 @ 符号)实现。定义注解与定义接口非常像,如下代码可定义一个简单形式的注解类型。 上述代码声明了一个 Test 注解。默认情况下,注解可以在程序的任何地方使用,通常用于修饰类、接口、方法和变量等。

  • 本文向大家介绍Angular2表单自定义验证器的实现,包括了Angular2表单自定义验证器的实现的使用技巧和注意事项,需要的朋友参考一下 本文主要给大家介绍如何判断验证器的结果。在这里,我们就来看看怎样实现一个自定义的验证器。 目标 我们要实现一个验证手机号的验证器,使用的实例还是基于之前的文章里面的实例,也就是用户信息输入的表单页面。我们在手机号的元素上添加一个验证手机号的验证器。然后,如果手