java实现自定义校验注解

直接上干活

import com.free.common.annotation.validator.PhoneValidator;

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

/**
 * 自定义手机号验证
 *
 */
@Constraint(validatedBy = PhoneValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Phone {
    String message() default "手机号输入有误,请重新输入";

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

    Class<? extends Payload>[] payload() default {};
}


import com.free.common.annotation.Phone;
import org.apache.commons.lang3.StringUtils;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;

/**
 * 自定义手机号验证实现
 */
public class PhoneValidator implements ConstraintValidator<Phone, String> {
    private Pattern pattern = Pattern.compile("^(13[0-9]|14[0-9]|15[0-9]|16[0-9]|17[0-9]|18[0-9]|19[0-9])\\d{8}$");

    @Override
    public void initialize(Phone phone) {
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        boolean matches = true;
        if (StringUtils.isNotBlank(value)) {
            matches = pattern.matcher(value).matches();
        }
        return matches;
    }
}

@Documented

是元注解,可以修饰其他注解,可以修饰其他注解,如果一注解没有被@Documented修饰,最终生成的文档中不会带此注解

@Retention(RetentionPolicy.RUNTIME)

被它所注解的注解保留多久,一共有三种策略
runtime:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在
class:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认生命周期
source:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;被编译器忽略
这3个生命周期分别对应于:Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码。

@Target

被这个 @Target 注解修饰的注解将只能作用在成员字段上,不能用于修饰方法或者类。其中,ElementType 是一个枚举类型,有以下一些值:

ElementType.TYPE:允许被修饰的注解作用在类、接口和枚举上

ElementType.FIELD:允许作用在属性字段上

ElementType.METHOD:允许作用在方法上

ElementType.PARAMETER:允许作用在方法参数上

ElementType.CONSTRUCTOR:允许作用在构造器上

ElementType.LOCAL_VARIABLE:允许作用在本地局部变量上

ElementType.ANNOTATION_TYPE:允许作用在注解上

ElementType.PACKAGE:允许作用在包上

@Constraint

源码:
@Documented
@Target({ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Constraint {
    Class<? extends ConstraintValidator<?, ?>>[] validatedBy();
}
即我们需要一个实现ConstraintValidator接口的类
public interface ConstraintValidator<A extends Annotation, T> {
    void initialize(A var1);

    boolean isValid(T var1, ConstraintValidatorContext var2);
}
可以看出,需要重写两个方法,一个是初始化,一个就是校验
所以我们把验证规则写在isValid里面,就能获得自己的自定义校验注解
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的自定义注解是一种给代码提供额外信息的方式,可以在运行时通过反射机制获取注解的信息。通过自定义注解,我们可以实现参数校验,提高代码的健壮性和可维护性。 首先,我们需要定义一个注解类,用于定义参数校验的规则。比如,我们可以定义一个注解叫做@ParamCheck,用于对方法的参数进行校验。 ```java @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface ParamCheck { String value(); } ``` 接着,在需要进行参数校验的方法上使用@ParamCheck注解,并给注解传入校验规则的表达式。比如,我们可以给一个名为checkNumber的方法的参数添加校验注解。 ```java public void checkNumber(@ParamCheck("number > 0") int number) { // ... } ``` 然后,在方法内部,通过反射机制获取参数的注解信息,并根据注解中定义的校验规则对参数进行校验。 ```java public void checkNumber(int number) { Parameter parameter = ...; // 获取方法的参数信息 ParamCheck paramCheckAnnotation = parameter.getAnnotation(ParamCheck.class); if (paramCheckAnnotation != null) { String expression = paramCheckAnnotation.value(); // 根据expression对number进行校验 // ... } } ``` 最后,我们可以在调用checkNumber方法时传入一个不满足校验规则的参数,比如-10,当方法内部进行参数校验时,可以捕获到校验失败的情况,并进行相应处理。 ```java checkNumber(-10); // 参数校验失败,抛出异常或者进行其他处理 ``` 通过自定义注解实现参数校验可以方便地对代码进行统一的校验规则管理,提高代码的可维护性和可读性。同时,由于注解是在运行时通过反射获取,可以对代码进行动态改变和扩展,使得我们可以更加灵活地进行参数校验

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值