我有一個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);
我在春季項目中使用這個,所以如果春天有另一種方式,我會很高興知道。