注解校验参数接收类字段两者必传其一

文章介绍了一个自定义的Java注解@AtLeastOneNotEmpty,用于在对象中确保至少有一个指定的字段不为空。注解支持多个字段的校验,并提供了对应的验证器逻辑,通过检查字段值是否为空来确定验证是否通过。该机制可以增强数据验证功能,适用于表单提交或数据处理场景。
摘要由CSDN通过智能技术生成

先上注解:

@AtLeastOneNotEmpty

使用:

@AtLeastOneNotEmpty(fields = {"name1","name2"},message = "name1,name2必填其一")
@AtLeastOneNotEmpty(fields = {"name3","name4"},message = "name3,name4必填其一")

上源码:

 AtLeastOneNotEmpty 注解类

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(
    validatedBy = {AtLeastOneNotEmptyValidator.class}
)
@Repeatable(AtLeastOneNotEmpties.class)
@Documented
public @interface AtLeastOneNotEmpty {
    String message() default "至少有一个属性不可为空";

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

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

    String[] fields();
}

支持多个校验:

AtLeastOneNotEmpties


@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AtLeastOneNotEmpties {
    AtLeastOneNotEmpty[] value();
}

 逻辑实现代码:

public class AtLeastOneNotEmptyValidator extends AbstractValidator<AtLeastOneNotEmpty, Object> {
    private String[] fields;

    public AtLeastOneNotEmptyValidator() {
    }

    public void initialize(AtLeastOneNotEmpty atLeastOneNotEmpty) {
        this.fields = atLeastOneNotEmpty.fields();
    }

    public boolean check(Object object, WrapperHibernateConstraintValidatorContext wrapperHibernateConstraintValidatorContext) {
        if (object == null) {
            return true;
        } else {
            try {
                String[] var3 = this.fields;
                int var4 = var3.length;

                for(int var5 = 0; var5 < var4; ++var5) {
                    String fieldName = var3[var5];
                    Object value = this.getFieldValue(object, fieldName);
                    if (this.notEmpty(value)) {
                        return true;
                    }
                }

                return false;
            } catch (Exception var8) {
                throw new IllegalStateException(var8);
            }
        }
    }

    private Object getFieldValue(Object object, String fieldName) throws IllegalAccessException {
        if (object == null) {
            return null;
        } else {
            Class<?> clazz = object.getClass();
            Field[] classFields = clazz.getDeclaredFields();
            Field[] var5 = classFields;
            int var6 = classFields.length;

            for(int var7 = 0; var7 < var6; ++var7) {
                Field field = var5[var7];
                if (field.getName().equals(fieldName)) {
                    field.setAccessible(true);
                    return field.get(object);
                }
            }

            return null;
        }
    }

    private boolean notEmpty(Object value) {
        if (Objects.isNull(value)) {
            return false;
        } else {
            return value instanceof String ? StringUtils.isNotBlank((String)value) : true;
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

C__jx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值