gpt4 book ai didi

java - Spring 自定义基于条件的验证

转载 作者:行者123 更新时间:2023-12-02 02:06:50 24 4
gpt4 key购买 nike

我想在 spring validator 中创建基于条件的验证。我有一个 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;
}

请指导。

谢谢

最佳答案

如果您的验证依赖于多个字段(例如,isPrimaryprimaryDTO secondaryDTO),那么唯一的解决方案是编写类级别的自定义 validator (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 {};
}

并创建一个 validator ,仅在 isPrimary()false 时验证 secondaryDTO 字段:

@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();
}
}
}

之后,您可以从 secondaryDTO 字段中删除 @Valid 注释,并将 @ValidSecondary 注释添加到 顶部>用户DTO:

@ValidSecondary // Add this
public class UserDTO {
@Valid
private PrimaryDTO primaryDTO;
private SecondaryDTO secondaryDTO; // No more @Valid
private boolean primary;
}

但是,在这种情况下,您将丢失来自 SecondaryDTO 内的任何约束违规消息,如果您想要某种传递机制,您可以将违规添加到 isValid() 方法中的constraintValidatorContext,例如:

Set<ConstraintViolation<SecondaryDTO>> violations = validator.validate(userDTO.getSecondaryDTO());
violations.forEach(violation -> constraintValidatorContext
.buildConstraintViolationWithTemplate(violation.getMessage())
.addConstraintViolation());

关于java - Spring 自定义基于条件的验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50636698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com