我正在尝试使用 Validator 接口以编程方式执行自定义对象验证。这是一个简单的例子,
public record Product(String name, int price) implements Serializable {}
public class PositivePriceValidator implements Predicate<Product> {
@Override
public boolean test(Product product) {
return product.price() > 0;
}
}
PositivePriceValidator
创建过程中以编程方式注册 ValidatorFactory
。我正在使用 Hibernate Validator 作为 Bean 验证提供程序,class MyConstraintValidatorFactory implements ConstraintValidatorFactory {
@Override
public <T extends ConstraintValidator<?, ?>> T getInstance(Class<T> constraintType) {
if(constraintType.equals(PositivePriceValidator.class)) {
return (T) new PositivePriceValidator();
}
return null;
}
@Override
public void releaseInstance(ConstraintValidator<?, ?> instance) {
}
}
最后这是我的测试,
@Test
public void testInvalidProduct() {
ValidatorFactory factory = Validation.byProvider(HibernateValidator.class)
.configure()
.constraintValidatorFactory(new MyConstraintValidatorFactory())
.buildValidatorFactory();
Validator validator = factory.getValidator();
Product invalidProduct = new Product("Hat", -5);
Set<ConstraintViolation<Product>> violations = validator.validate(invalidProduct);
assertEquals(1, violations.size());
}
上述测试失败 -
org.opentest4j.AssertionFailedError: expected: <1> but was: <0>
有人可以帮助我理解这段代码有什么问题吗?
注意:我知道在这种情况下我可以直接在此处添加 @Positive 注释,但上面只是一个示例。我想在无法应用默认或自定义 BV 注释的地方使用此方法。
通常我认为你需要这样的东西来装饰你的界面
@Constraint(validatedBy = PositivePriceValidator.class)
public @interface PositivePrice {
String message() default "Price must be greater than 0";
}