自定义电话验证注解

该博客介绍了如何利用Hutool工具包在Java中创建一个自定义注解`@IsPhone`来验证电话号码的正确性。注解可以应用于字段、方法等,其内部实现了`ConstraintValidator`接口,通过`PhoneUtil.isMobile()`方法确保输入的字符串是有效的中国电话号码。此外,博客还提到了注解的使用示例,并列出了可用的ElementType。

这里要用到hutool的工具包来判定哦

package com.yqs.utils.convenient;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**验证是否是正确的电话号码 也可判定是否为空  作用于String 类型 判定范围为中国电话号码
 * @author 小乌龟
 */


@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {IsPhoneValidation.class})
public @interface IsPhone {
    String message() default "手机号格式错误";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
package com.yqs.utils.convenient;

import cn.hutool.core.util.PhoneUtil;
import org.apache.commons.lang3.StringUtils;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.annotation.Annotation;

/**
 * @Description 手机号码验证 调用了hutool的工具包
 * @Author 小乌龟
 * @Date 2022/3/2 16:15
 */
public class IsPhoneValidation implements ConstraintValidator<IsPhone, String> {

    @Override
    public void initialize(IsPhone constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        if (StringUtils.isEmpty(value)) {
            return false;
        } else {
            return PhoneUtil.isMobile(value);
        }
    }
}

还可以扩展哦 

取值(ElementType)有:

    1.CONSTRUCTOR:用于描述构造器
    2.FIELD:用于描述域
    3.LOCAL_VARIABLE:用于描述局部变量
    4.METHOD:用于描述方法
    5.PACKAGE:用于描述包
    6.PARAMETER:用于描述参数
    7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

使用:

  @ApiModelProperty(value = "电话号码")
    @IsPhone
    private String phoneNumber;

结果:

Java中创建自定义验证注解涉及几个关键步骤,包括定义注解本身、创建验证逻辑以及将注解应用到目标字段上。以下是一个完整的示例,展示了如何实现这一过程。 ### 自定义注解的定义 首先,需要定义一个注解,并指定其验证逻辑。注解的生命周期应设置为`RUNTIME`,以便在运行时进行处理。例如,定义一个名为`@Odd`的注解,用于验证一个整数是否为奇数。 ```java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Odd { } ``` ### 验证逻辑的实现 接下来,需要实现一个验证器,该验证器将在运行时检查带有自定义注解的字段是否满足特定条件。在这个例子中,验证器将检查整数是否为奇数。 ```java import java.lang.reflect.Field; public class Validator { public static boolean validate(Object obj) throws IllegalAccessException { boolean isValid = true; for (Field field : obj.getClass().getDeclaredFields()) { if (field.isAnnotationPresent(Odd.class)) { field.setAccessible(true); int value = field.getInt(obj); if (value % 2 == 0) { System.out.println(field.getName() + " must be an odd number."); isValid = false; } } } return isValid; } } ``` ### 使用自定义注解 定义好注解验证器之后,就可以在实体类中使用该注解了。例如,在一个`Student`类中使用`@Odd`注解验证年龄字段。 ```java 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; } } ``` ### 测试验证逻辑 最后,可以通过创建一个`Student`实例并调用验证器来测试自定义注解的功能。 ```java public class Main { public static void main(String[] args) throws IllegalAccessException { Student student = new Student(); student.setAge(20); // 设置一个偶数,验证应该失败 student.setName("John"); if (!Validator.validate(student)) { System.out.println("Validation failed."); } else { System.out.println("Validation succeeded."); } } } ``` 通过这种方式,可以灵活地创建和使用自定义验证注解,以满足特定的业务需求。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新生代农民工-小王八

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值