AtLeastOneNonNullValidator.java 1.98 KB
package com.lego.common.annotation;

import com.lego.common.annotation.AtLeastOneNonNull;
import com.lego.common.utils.StringUtils;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * @author chentao
 * @date 2025/4/23
 */
public class AtLeastOneNonNullValidator implements ConstraintValidator<AtLeastOneNonNull, Object> {
    private List<String> fields;

    @Override
    public void initialize(AtLeastOneNonNull constraintAnnotation) {
        fields = Arrays.asList(constraintAnnotation.fields());
    }

    @Override
    public boolean isValid(Object object, ConstraintValidatorContext context) {
        if (object == null) {
            return false; // 如果对象本身为null,则不满足条件
        }
        for (String fieldName : fields) {
            try {
                Field field = object.getClass().getDeclaredField(fieldName);
                field.setAccessible(true); // 设置私有字段可访问,以便读取值
                System.out.println(field.getName()+"============"+field.get(object)+"!");
                if (Objects.nonNull(field.get(object))) { // 检查字段是否非空
                    String value = String.valueOf(field.get(object));
                    if(StringUtils.isNotEmpty(value) && !value.equals("null")) {
                        System.out.println(field.getName() + "============" + field.get(object) + "&");
                        return true; // 如果至少一个字段非空,返回true
                    }
                }
            } catch (NoSuchFieldException | IllegalAccessException e) {
                // 处理异常,例如记录日志等
                return false; // 出现异常时,保守起见返回false,实际中应更细致处理异常情况
            }
        }
        return false; // 所有指定字段均为空或出现异常,返回false
    }
}