gpt4 book ai didi

java - 从 isValid() 方法调用进一步的 validator ?

转载 作者:行者123 更新时间:2023-12-01 12:49:00 25 4
gpt4 key购买 nike

假设我有以下场景:

public class EntityA {
private List<EntityB> listOfBs;
}

仅当在某个验证组下运行时,我才会尝试将验证级联到 B 列表。所以理想情况下,这样:

public class EntityA {
@Valid(groups = {SomeSpecificGroup.class})
private List<EntityB> listOfBs;
}

不幸的是,@Valid 没有 groups() 属性。所以我想我会尝试这样的事情:

@Constraint(validatedBy = { CascadedValidator.class })
@Target({ ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CascadedValidation {
Class<?>[] groups() default { };
}

并编写一个 validator (CascadedValidator),激活后将执行级联(==将验证其所在集合的所有元素)。我的问题是如何执行级联验证?到目前为止我有这个:

public class CascadedValidator implements ConstraintValidator<CascadedValidation, Object>{
private Class<?>[] groups;

@Override public void initialize(CascadedValidation constraintAnnotation) {
groups = constraintAnnotation.groups();
}

@Override public boolean isValid(Object value, ConstraintValidatorContext context) {
if (value == null || !(value instanceof Iterable)) {
return true;
}
for (Object item : (Iterable)value) {
//validate item using the groups?!
}
}
}

我知道我可以通过创建另一个“内联” validator 来实现实际验证:

Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<Object>> violations;
if (decideIfCascade(groups)) {
for (Object item : (Iterable)value) {
if (groups!=null && groups.length>0) {
violations = validator.validate(item, groups);
} else {
violations = validator.validate(item);
}
if (!violations.isEmpty()) {
return false;
}
}
}
return true;

但这对我来说太难闻了。肯定有一种理智/正常/简单的方法可以做到这一点吗?

编辑 - 实际用例

我的 API 接受 EntityA(具有 B 列表)和 EntityB 作为顶级实体(因此您可以直接发送单个 B)。 A 和 B 都有一个 id 属性,但我只需要提交的顶级对象上有一个非空 id。因此,如果服务得到一个带有想法的 A 和几个“空白”B,那是可以的,但是如果我得到一个 B 作为顶级参数,它必须有一个 id。

最佳答案

您不应从 ConstraintValidator 实现中调用验证引擎。

如果您使用的是 Bean Validation 1.1,请查看 group conversions这使您可以控制级联验证时传播的验证组。例如。您可以执行以下操作:

@Valid
@ConvertGroup(from = Default.class, to = SomeSpecificGroup.class)
private List<EntityB> listOfBs;

关于java - 从 isValid() 方法调用进一步的 validator ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24402806/

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