V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
abokchoy
V2EX  ›  程序员

Java 求助

  •  
  •   abokchoy · 286 天前 · 1610 次点击
    这是一个创建于 286 天前的主题,其中的信息可能已经有所发展或是发生改变。
    public class Test{
        private String field;
        
        private String field2;
        //自定义校验规则
        @AssertTrue(message="个人基本信息-证件号码格式错误", groups = {Group.PC.class})
        public boolean isValid() {
            return "A".equals(this.field) ? isTrue(this.field2) : true;
        }
    }
    
    public class ValidateUtil {
        public static <T> void validate(T t, Class<?>... groups) throws ValidationException {
            Validator validatorFactory = Validation.buildDefaultValidatorFactory().getValidator();
            Set<ConstraintViolation<T>> errors = validatorFactory.validate(t, groups);
            if (!errors.isEmpty()) {
                for (ConstraintViolation<T> violation : errors) {
                    throw new ValidationException(violation.getMessage());
                }
            }
        }
    }
    

    我在使用 ValidateUtil.validate(test),如果函数名是 isValid()可以校验,如果不带 is ,valid()就不能校验,求指教

    9 条回复    2024-03-08 09:20:42 +08:00
    Belmode
        1
    Belmode  
       286 天前
    public Boolean valid() 试试
    ma836323493
        2
    ma836323493  
       286 天前
    那你就进到 validatorFactory.validate 看看是怎么回事
    abokchoy
        3
    abokchoy  
    OP
       286 天前
    @Belmode 试了,不行
    abokchoy
        4
    abokchoy  
    OP
       286 天前
    ```java
    public final <T> Set<ConstraintViolation<T>> validate(T object, Class<?>... groups) {
    Contracts.assertNotNull(object, Messages.MESSAGES.validatedObjectMustNotBeNull());
    ValidationContext<T> validationContext = this.getValidationContextBuilder().forValidate(object);
    if (!validationContext.getRootBeanMetaData().hasConstraints()) {
    return Collections.emptySet();
    } else {
    ValidationOrder validationOrder = this.determineGroupValidationOrder(groups);
    ValueContext<?, Object> valueContext = ValueContext.getLocalExecutionContext(this.parameterNameProvider, object, validationContext.getRootBeanMetaData(), PathImpl.createRootPath());
    return this.validateInContext(validationContext, valueContext, validationOrder);
    }
    }

    public <T> ValidationContext<T> forValidate(T rootBean) {
    Class<T> rootBeanClass = rootBean.getClass();
    return new ValidationContext(this.constraintValidatorManager, this.messageInterpolator, this.constraintValidatorFactory, this.traversableResolver, (ExecutableParameterNameProvider)null, this.clockProvider, this.failFast, rootBean, rootBeanClass, this.beanMetaDataManager.getBeanMetaData(rootBeanClass), (Executable)null, (Object[])null, (Object)null);
    }

    ```
    反射拿了对象的类信息
    sijue
        5
    sijue  
       286 天前
    public class AssertTrueValidator implements ConstraintValidator<AssertTrue, Boolean> {

    @Override
    public boolean isValid(Boolean bool, ConstraintValidatorContext constraintValidatorContext) {
    //null values are valid
    return bool == null || bool;
    }

    }

    public interface ConstraintValidator<A extends Annotation, T> {
    xxxx
    }
    -- 注解中指定的方法名是 isValid
    lvxiaomao
        6
    lvxiaomao  
       286 天前
    报错信息贴一些呗
    chendy
        8
    chendy  
       285 天前
    因为 valid 是一个普通方法,isValid 是 boolean 类型的 getter 方法
    校验只校验 getter 方法(印象里好像还有字段
    abokchoy
        9
    abokchoy  
    OP
       285 天前
    @gitdoit 多谢多谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3359 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 11:25 · PVG 19:25 · LAX 03:25 · JFK 06:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.