@Constraint注解,做特殊的入参校验

发布时间 2023-08-09 10:35:46作者: 探歌
// @Constraint 是 Java 中的注解之一,用于标记自定义的约束注解。约束注解通常用于数据验证,用来限制字段的取值或格式,确保数据的合法性。
@Constraint(validatedBy = FlagValidate.class)

 第一步:先建一个@interface Flag的注解校验类,注解相关的校验类为FlagValidate.Class:

import javax.validation.Constraint;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = FlagValidate.class)
// @Constraint 是 Java 中的注解之一,用于标记自定义的约束注解。约束注解通常用于数据验证,用来限制字段的取值或格式,确保数据的合法性。
// 新加 @Flag 校验参数注解
public @interface Flag {

    // 给一个返回的默认值,或者可以自己定义如: @DoneTime(param = "startValue")
    String message() default "Invalid flag value";

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

 第二步: 具体的校验类,校验方法:

import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * 自己写的校验类,需要实现javax.validation包下的类: ConstraintValidator
 */
public class FlagValidate implements ConstraintValidator<Flag, String> {

    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        System.out.println("校验入参的Flag 必须是Y或N: " + value);
        if (value == null || value.length() == 0) {
            return true;
        }
        return "Y".equals(value) || "N".equals(value);
    }
}

第三步: 使用,在需要检验的字段上加上刚才新建的注解:

@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
public class BulkTierChangeSaveReqVO {

    String buId;
    String programId;
    String newTierId;
    @NotEmpty
    Set<String> visibleCards;
    @Flag
    String flag;
}