Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Validator.validateValue在beanType是接口时忽略验证(hibernate-Validator-6.0.18)_Java_Hibernate_Validation - Fatal编程技术网

Java Validator.validateValue在beanType是接口时忽略验证(hibernate-Validator-6.0.18)

Java Validator.validateValue在beanType是接口时忽略验证(hibernate-Validator-6.0.18),java,hibernate,validation,Java,Hibernate,Validation,我创建了一个库,它只包含为域对象建模的接口。这些接口具有我想要测试的(类、属性、方法和构造函数级别)约束 例如: public interface User { @NotNull @Email String getEmail(); } 我想测试约束是否得到正确应用,因此我编写了一些测试。然而,我得到了意想不到的行为 class UserTest { @Test void thisTestFails() { Validator valida

我创建了一个库,它只包含为域对象建模的接口。这些接口具有我想要测试的(类、属性、方法和构造函数级别)约束

例如:

public interface User {
    @NotNull
    @Email
    String getEmail();
}
我想测试约束是否得到正确应用,因此我编写了一些测试。然而,我得到了意想不到的行为

class UserTest {
    @Test
    void thisTestFails() {
        Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
        Set<ConstraintViolation<User>> violations = validator.validateValue(User.class, "email", null);
        assertEquals(1, violations.size());
    }

    @Test
    void thisTestPasses() {
        Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
        Set<ConstraintViolation<UserImpl>> violations = validator.validateValue(UserImpl.class, "email", null);
        assertEquals(1, violations.size());
    }

    private static class UserImpl implements User {
        @Override
        public String getEmail() {
            return null;
        }
    }
} 
class用户测试{
@试验
void thisTestFails(){
Validator Validator=Validation.buildDefaultValidatorFactory().getValidator();
设置冲突=validator.validateValue(User.class,“email”,null);
assertEquals(1,违例项.size());
}
@试验
void thisTestPasses(){
Validator Validator=Validation.buildDefaultValidatorFactory().getValidator();
设置冲突=validator.validateValue(UserImpl.class,“email”,null);
assertEquals(1,违例项.size());
}
私有静态类UserImpl实现用户{
@凌驾
公共字符串getEmail(){
返回null;
}
}
} 
当为
类beanType
提供的参数是接口时,Hibernate完全忽略验证。
我不想仅仅为了测试这些接口而创建具体的类。这是预期的行为还是Hibernate中的错误?

这是预期的行为。Bean验证规范定义可以在接口或类中定义约束,但验证的是遵循javabean约定的属性状态

接口可以定义由类实现的getter方法,但它本身没有属性

这些是本规范的相关部分:

5.1.1。对象验证

约束声明可以应用于类或接口。将约束应用于类或接口 表示类或类的状态的验证 实现接口

5.1.2。字段和属性验证

约束声明可以应用于字段和属性 对于相同的对象类型。但是,不应使用相同的约束 在字段及其关联属性(约束)之间复制 验证将应用两次)。建议将其用于对象 持有约束声明以遵守单个状态访问 策略(带注释的字段或属性)

使用约束声明对字段进行注释时,字段访问 策略用于访问由该约束验证的状态

当使用约束声明对属性进行注释时,属性 访问策略用于访问通过该策略验证的状态 约束

validateValue方法确实不需要实例,因此理论上它可以测试接口的约束。但是请注意,class参数是一个
beanType
,bean的类型需要是一个类,因为接口没有构造函数

请注意方法
getConstraintsForClass
Validator
的区别,该方法明确声明可以在接口上声明约束:

已计算类或接口类型

的类参数validateValue

豆型


谢谢你的回复。你能告诉我规范中提到这一点的部分吗?我把它们添加到了答案中。