我想在spring验证器中创建基于条件的验证。
我有一个 UserDTO 类,因为有两个带有@Valid
注释的DTO类。
如果我通过 isPrimary true
,那么它应仅验证 primaryDTO bean并忽略 secendoryDTO 验证。
public class UserDTO {
@Valid
private PrimaryDTO primaryDTO;
@Valid
private SecendoryDTO secendoryDTO;
private boolean isPrimary;
}
public class PrimaryDTO {
@NotEmpty(message = "Please enter email.")
@Email(message = "Please enter a valid email.")
private String email;
}
public class SecendoryDTO {
@NotEmpty(message = "Please enter phone.")
private String phone;
}
请指南。
由于
答案 0 :(得分:2)
如果验证取决于多个字段(例如isPrimary
和primaryDTO
或secondaryDTO
),那么唯一的解决方案是在类级别上编写自定义验证器({{1} })将实现条件验证本身。
例如,创建一个注释:
UserDTO
创建一个仅在@Documented
@Retention(RUNTIME)
@Target({ANNOTATION_TYPE, TYPE})
@Constraint(validatedBy = SecondaryValidator.class)
public @interface ValidSecondary {
String message() default "Invalid secondary";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
为secondaryDTO
时验证isPrimary()
字段的验证程序:
false
之后,您可以从@Component
public class SecondaryValidator implements ConstraintValidator<ValidSecondary, UserDTO> {
private Validator validator;
public SecondaryValidator(Validator validator) {
this.validator = validator;
}
@Override
public boolean isValid(UserDTO userDTO, ConstraintValidatorContext constraintValidatorContext) {
if (userDTO.isPrimary()) {
return true;
} else {
return validator.validate(userDTO.getSecondaryDTO()).isEmpty();
}
}
}
字段中删除@Valid
注释,并在secondaryDTO
上添加@ValidSecondary
注释:
UserDTO
但是,在这种情况下,您将从@ValidSecondary // Add this
public class UserDTO {
@Valid
private PrimaryDTO primaryDTO;
private SecondaryDTO secondaryDTO; // No more @Valid
private boolean primary;
}
中丢失任何约束违规消息,如果您想要某种传递机制,可以将违规添加到SecondaryDTO
内constraintValidatorContext
方法,例如:
isValid()