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
:
豆型
谢谢你的回复。你能告诉我规范中提到这一点的部分吗?我把它们添加到了答案中。