如何实现自定义ConstraintValidatorFactory?

问题描述 投票:0回答:1

我正在尝试使用 Validator 接口以编程方式执行自定义对象验证。这是一个简单的例子,

  1. 模型类(记录)
public record Product(String name, int price) implements Serializable {}
  1. 自定义验证逻辑:验证产品价格是否为正
public class PositivePriceValidator implements Predicate<Product> {
    @Override
    public boolean test(Product product) {
        return product.price() > 0;
    }
}
  1. 现在我尝试在
    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>

有人可以帮助我理解这段代码有什么问题吗?

或者如何实现这一点 - https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/?v=8.0#example-using-custom-constraint-validator-factory

注意:我知道在这种情况下我可以直接在此处添加 @Positive 注释,但上面只是一个示例。我想在无法应用默认或自定义 BV 注释的地方使用此方法。

java bean-validation hibernate-validator
1个回答
0
投票

通常我认为你需要这样的东西来装饰你的界面

@Constraint(validatedBy = PositivePriceValidator.class)
public @interface PositivePrice {
    String message() default "Price must be greater than 0";
}
© www.soinside.com 2019 - 2024. All rights reserved.