Как добавить ConstraintViolations в элемент списка по индексу i с помощью пользовательского ConstraintValidator - PullRequest
1 голос
/ 01 апреля 2019

В настоящее время я работаю над пользовательским ConstraintValidator, чтобы проверить массив объектов, с которым связан временной промежуток, на перекрытия в их временном интервале. Логика проверки работает, однако я не уверен, как добавить сообщение «Временной интервал этого объекта перекрывается с временным интервалом другого объекта» для каждого объекта в нарушение логики проверки.

Я пробовал несколько подходов, описанных здесь: https://docs.oracle.com/javaee/7/api/javax/validation/ConstraintValidatorContext.html

В частности, те, которые описаны в документах buildConstraintViolationWithTemplate.

Вот соответствующий раздел кода:

@Override
public 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;
}

Как видите, я попробовал подход .addBeanNode().inIterable().atIndex(index) здесь. Если посмотреть на ConstraintViolation s, путь свойства отображается как list[index]. Это правильно?

Я планирую использовать это для доступа к установленным нарушениям из BindingResult в шаблоне Thymeleaf и не уверен, будут ли нарушения доступны таким образом. Список будет принадлежать другому бину, поэтому я ожидаю прочитать нарушения, используя путь типа propertyNameOfList[index]. Или это будет propertyNameOfList.list[index] или что-то еще?

...