为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用自定义约束验证符将约束漏洞添加到索引 i 处的列表元素

如何使用自定义约束验证符将约束漏洞添加到索引 i 处的列表元素

慕容3067478 2022-09-14 15:37:50
我目前正在研究一个自定义项,以检查具有与其关联的时间跨度的对象数组,以检查其时间跨度中的重叠。验证逻辑正在工作,但是,我不确定如何将“此对象的时隙与另一个对象的时隙重叠”消息添加到违反验证逻辑的每个对象。ConstraintValidator我尝试了这里描述的几种方法:https://docs.oracle.com/javaee/7/api/javax/validation/ConstraintValidatorContext.html特别是那些在方法文档中描述的那些。buildConstraintViolationWithTemplate以下是代码的相关部分:@Overridepublic boolean isValid(List<Shift> shifts, ConstraintValidatorContext context) {List<Integer> overlappingShiftIndices = determineOverlappingShifts(shifts);if (!overlappingShiftIndices.isEmpty()) {  log.debug("Overlap validation failed.");  context.disableDefaultConstraintViolation();  // Moving the error from form-level to fields  for (int index : overlappingShiftIndices) {    context.buildConstraintViolationWithTemplate("{com.generali.standbyscheduler.validation.shiftlist.overlap}")           .addBeanNode()           .inIterable().atIndex(index)           .addConstraintViolation();  }  return false;}log.debug("Overlap validation succeeded.");return true;}如您所见,我在这里尝试了这种方法。查看 s 时,属性路径显示为 。这是正确的吗?.addBeanNode().inIterable().atIndex(index)ConstraintViolationlist[index]我计划使用它来访问Thymeleaf模板中确定的违规行为,并且不确定违规行为是否可以通过这种方式访问。该列表将是另一个 bean 的属性,因此我希望使用类似 .还是会是别的什么?BindingResultpropertyNameOfList[index]propertyNameOfList.list[index]
查看完整描述

1 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

当尝试验证某些字段在对象列表中是否唯一时,我遇到了同样的问题。我自己的解决方案(我在互联网上没有找到:/ ):


您必须覆盖当前属性节点并使用 添加索引号。例:.addPropertyNode(null).inIterable().atIndex(index)


约束注释:


@Target({ElementType.FIELD, ElementType.PARAMETER})

@Retention(RetentionPolicy.RUNTIME)

@Constraint(validatedBy = UniqueBusinessIndexValidator.class)

public @interface UniqueEntries {


    String message() default ValidationMessages.REQUIRED_UNIQUE_INDEX;

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}

约束验证符:


public class UniqueBusinessIndexValidator implements ConstraintValidator<UniqueEntries, List<HasBusinessIndex>> {


    @Override

    public boolean isValid(List<HasBusinessIndex> collection, ConstraintValidatorContext context) {

        if (collection == null || collection.isEmpty()) {

            return true;

        }


        Map<String, List<Integer>> indexesMap = new HashMap<>();

        for (int runner = 0; runner < collection.size(); runner++) {

            String businessIndex = collection.get(runner).getBusinessIndex();

            if (indexesMap.containsKey(businessIndex)) {

                indexesMap.get(businessIndex).add(runner);

            } else {

                indexesMap.put(businessIndex, new ArrayList<>(List.of(runner)));

            }

        }


        boolean isValid = indexesMap.values().stream().noneMatch(indexes -> indexes.size() > 1);

        if (!isValid) {

            indexesMap.values()

                      .stream()

                      .filter(index -> index.size() > 1)

                      .forEach(index -> addUniqueBusinessIndexkennungViolation(context, index));

        }

        return isValid;

    }


    private void addUniqueBusinessIndexkennungViolation(ConstraintValidatorContext context, List<Integer> indexes) {

        for (Integer index : indexes) {

            context.buildConstraintViolationWithTemplate(ValidationMessages.REQUIRED_UNIQUE_INDEX)

                   .addPropertyNode(null)

                   .inIterable()

                   .atIndex(index)

                   .addPropertyNode("businessIndex")

                   .addConstraintViolation()

                   .disableDefaultConstraintViolation();

        }

    }


查看完整回答
反对 回复 2022-09-14
  • 1 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信