实际检查发生在哪里?
如果您仔细查看 - javax.validation.constraints.@NotNull 源代码(您已粘贴),@Constraint(validatedBy = { }) 留空,即未指定哪个是实现类。这是因为 javax 验证 jar 像 - validation-api-2.0.1.Final.jar 等基本上是一个 bean 验证标准(一组没有实现的接口、注释等)。这些约束的实现由 hibernate、Oracle 等供应商提供。
This link 列出了三个标准,因此您应该知道您使用的是哪个版本的 bean 验证标准。
所以如果你有像 - hibernate-validator-6.0.10.Final.jar 这样的实现 jar,你也可以看到实现源代码,
/*
* Hibernate Validator, declare and validate application constraints
*
* License: Apache License, Version 2.0
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package org.hibernate.validator.internal.constraintvalidators.bv;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.constraints.NotNull;
/**
* Validate that the object is not {@code null}.
*
* @author Emmanuel Bernard
*/
public class NotNullValidator implements ConstraintValidator<NotNull, Object> {
@Override
public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
return object != null;
}
}
现在,您必须了解搜索/解决 bean 验证标准的实现是一项复杂的任务,请参阅 - javax.validation.ValidationProviderResolver & 如果开发人员使用 Spring Boot 等框架,此过程会变得很容易。
Answer by inigo skimmer 也做了这两件事 - 为您的自定义验证声明一个注释,实现实际验证并通过硬编码验证器类解析验证器 - @Constraint(validatedBy = {TicketPresenceValidator.class}) & 这使您免于复杂的验证实现搜索逻辑。
您必须了解的另一部分是您的验证器类型为javax.validation.ConstraintValidator,因此请阅读 javadoc 作为您需要提供给this interface 的内容
其他可以参考的链接,
Creating custom constraints
Create Your Own Constraints With Bean Validation 2.0