Java 求助

62 天前
 abokchoy
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()就不能校验,求指教

1392 次点击
所在节点    程序员
9 条回复
Belmode
62 天前
public Boolean valid() 试试
ma836323493
62 天前
那你就进到 validatorFactory.validate 看看是怎么回事
abokchoy
62 天前
@Belmode 试了,不行
abokchoy
62 天前
```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
62 天前
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
62 天前
报错信息贴一些呗
gitdoit
62 天前
chendy
62 天前
因为 valid 是一个普通方法,isValid 是 boolean 类型的 getter 方法
校验只校验 getter 方法(印象里好像还有字段
abokchoy
62 天前
@gitdoit 多谢多谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1021470

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX