Путь свойства нарушения ограничений при использовании наборов

Я не могу понять проблему, связанную с требованием проверки бина JSR303 (в настоящее время я использую Hibernate Validator).

Предполагая, что у меня есть следующая модель предметной области

class Foo {
   private Set<Bar> bars = new HashSet<>();

   @Valid
   public Set<Bar> getBars() { ... }
}

class Bar {
   private String name;

   @NotBlank
   public String getName() { ... }
}

Скажем, у меня есть экземпляр foo с двумя bar, одно из которых пусто. После проверки foo у меня в руках нарушение ограничения @NotBlank с путем к свойству bars[].name. Что все хорошо, но...

есть ли способ узнать, у какого из двух баров было пустое имя? Или я вынужден использовать здесь List и анализировать - тогда уникальный - путь к свойству с использованием отражения?


person Stefan Haberl    schedule 10.06.2015    source источник


Ответы (1)


Последний выпуск Hibernate Validator, 5.2.0.CR1, предоставляет решение для этого. Вы можете развернуть узлы пути свойства и получить значение свойства. Таким образом, вы узнаете, какой экземпляр Bar затронут:

Set<ConstraintViolation<Foo>> constraintViolations = ...;

Path path = constraintViolations.iterator().next().getPropertyPath();
Iterator<Path.Node> nodeIterator = path.iterator();

Path.Node node = nodeIterator.next();
Bar bar = (Bar) node.as( PropertyNode.class ).getValue();
person Gunnar    schedule 11.06.2015
comment
Ох, это было бы именно то, что мне нужно! К сожалению, я пока не могу обновить Hibernate Validator до версии 5.2.0.CR1, потому что она еще не выпущена (политика компании). Думаю, мне пока придется придерживаться Lists. +1 за указание на светлое новое будущее. - person Stefan Haberl; 11.06.2015