我有一个bean,它有很多用JSR-303验证注释标注的字段。现在有一个新的要求,即其中一个字段是强制性的,但仅限于某些条件。JSR-303验证组定义了一个默认组
我环顾四周,找到了我需要的验证组。
这是我现在有:
public interface ValidatedOnCreationOnly {
}
@NotNull(groups = ValidatedOnCreationOnly.class)
private String employerId;
@Length(max = 255)
@NotNull
private String firstName;
@Length(max = 255)
@NotNull
private String lastName;
然而,当我运行此验证在单元测试:
@Test
public void testEmployerIdCanOnlyBeSetWhenCreating() {
EmployeeDTO dto = new EmployeeDTO();
ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
Set<ConstraintViolation<EmployeeDTO>> violations = vf.getValidator().validate(dto, EmployeeDTO.ValidatedOnCreationOnly.class);
assertEquals(violations.size(), 3);
}
事实证明,所有的非组注释的验证是忽略,我只有1违反。
我可以理解这种行为,但我想知道是否有办法让我的团队也包括所有未注释的参数。如果不是我不得不做这样的事情:
public interface AlwaysValidated {
}
public interface ValidatedOnCreationOnly extends AlwaysValidated {
}
@NotNull(groups = ValidatedOnCreationOnly.class)
private String employerId;
@Length(max = 255, groups = AlwaysValidated.class)
@NotNull(groups = AlwaysValidated.class)
private String firstName;
@Length(max = 255, groups = AlwaysValidated.class)
@NotNull(groups = AlwaysValidated.class)
private String lastName;
我的工作真正的类有很多更多的字段(约20),因此这种方法变成什么指示验证的一条明路陷入一片混乱。
任何人都可以告诉我,如果有更好的方法吗?也许是这样的:
vf.getValidator().validate(dto, EmployeeDTO.ValidatedOnCreationOnly.class, NonGroupSpecific.class);
我在春季项目中使用这个,所以如果春天有另一种方式,我会很高兴知道。