当前位置: 首页 > 知识库问答 >
问题:

基于spring自定义条件的验证

全心思
2023-03-14

我想在spring验证器中创建基于条件的验证。我有一个UserDTO类,因为有两个DTO类带有@valid注释。

如果我传递isPrimarytrue,那么它应该只验证primaryDTO bean,而忽略secondoryDTO验证。

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个答案

盖翰池
2023-03-14

如果您的验证依赖于多个字段(例如isprimaryprimarydtosecondarydto),那么唯一的解决方案是在classlevel上编写一个自定义验证器(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 {};
}

并创建一个验证器,该验证器仅在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字段中删除@validsecondar批注,并在userDTo上添加@validsecondar批注:

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

但是,在这种情况下,您将丢失来自SecondaryDTO中的任何约束冲突消息,如果您希望具有某种传递机制,可以将冲突添加到IsValidatorContext方法中的ConstraintValidatorContext中,例如:

Set<ConstraintViolation<SecondaryDTO>> violations = validator.validate(userDTO.getSecondaryDTO());
violations.forEach(violation -> constraintValidatorContext
    .buildConstraintViolationWithTemplate(violation.getMessage())
    .addConstraintViolation());
 类似资料:
  • 我在用任何逻辑建立我的模型。我创建了一个带有自定义发行版的代理群体,在其中我放入了一个选项列表。我提出了5个选项(类别):A、B、C、D和E,每个选项都有其各自的百分比。我想做的是代理去两个不同的服务的基础上的选项(类别)。我在模型中有一个selectOutput,但我不知道该把什么作为条件来实现这一点,也就是说,如果代理是a或B,那么我希望它转到service_1,如果它是C、D或E,我希望它们

  • 嗨,伙计们,我正在开发应用程序使用spring boot和spring security在我的应用程序中进行身份验证,我使用自定义令牌,并且我能够成功地对用户进行身份验证。现在我想添加自定义授权到我的应用程序我想通过以下方式进行授权: 我的自定义userDetails服务如下:

  • 本文向大家介绍基于JavaScript实现自定义滚动条,包括了基于JavaScript实现自定义滚动条的使用技巧和注意事项,需要的朋友参考一下 可直接使用的js滚动条,先看看效果图: 代码如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 有部分条件如 target_os 在使用 rustc 时会隐式地提供,但是自定义条件必须使用 --cfg 标记来传给 rustc。 #[cfg(some_condition)] fn conditional_function() { println!("condition met!") } fn main() { conditional_function(); } 不使用自定义的

  • 我有一个自定义注释@UniqueModel,它由ConstraintValidator验证: 问题是,我需要在调用存储库的safe()-方法之前进行验证,否则字段注入将无法工作。 因此,我创建了一个带有@Valid注释的委托方法,以便在以下情况之前强制进行唯一验证: 不幸的是,这不起作用,似乎@Valid注释被Spring忽略了。 我如何确保验证的正确时间?

  • 配置类 注释类 验证程序类 我有一个属性为的类,我还使用了其他注释,比如和,最后两个可以工作,但我的自定义注释不工作。 你能帮助理解为什么Spring不调用自定义验证器吗?