【发布时间】:2023-03-29 07:33:01
【问题描述】:
我有一个 bean,它有很多用 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);
我在一个 spring 项目中使用它,所以如果 spring 有另一种方式,我会很高兴知道。
【问题讨论】:
-
在控制器上 @Validated( {ValidatedOnCreationOnly.class,Default.class}
标签: java spring validation bean-validation