基于Spring自定义条件的验证

时间:2018-06-01 05:37:18

标签: java spring spring-mvc spring-boot spring-validator

我想在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;
}

请指南。

由于

1 个答案:

答案 0 :(得分:2)

如果验证取决于多个字段(例如isPrimaryprimaryDTOsecondaryDTO),那么唯一的解决方案是在类级别上编写自定义验证器({{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; } 中丢失任何约束违规消息,如果您想要某种传递机制,可以将违规添加到SecondaryDTOconstraintValidatorContext方法,例如:

isValid()