Индекс недопустимого объекта в списке

#oval

#oval

Вопрос:

Существует ли эквивалент метода getPropertyPath в рамках проверки Oval?

Приведенный ниже пример кода выводит свойства всех вложенных недопустимых значений объекта. Я хотел бы также напечатать индекс недопустимого объекта в списке, но я не уверен, как это можно сделать в Oval.

С помощью javax.validation я могу вызвать ConstraintViolation#getPropertyPath , но, похоже, в Oval нет эквивалента. Я что-то упустил?

Вывод

 list[].value: example.ValidationDemo$Child.value cannot be null
list[].value: example.ValidationDemo$Child.value cannot be null
 

Вот код:

 package example;

import java.util.List;

import net.sf.oval.ConstraintViolation;
import net.sf.oval.Validator;
import net.sf.oval.constraint.AssertValid;
import net.sf.oval.constraint.NotNull;
import net.sf.oval.context.FieldContext;

public class ValidationDemo {
    public static void main(String[] args) {
        Validator validator = new Validator();
        validator.validate(new Parent())
                .forEach(ValidationDemo::printViolation);
    }

    private static void printViolation(ConstraintViolation violation) {
        printViolation(violation, "");
    }

    private static void printViolation(ConstraintViolation violation, String property) {
        FieldContext fieldContext = (FieldContext) violation.getContext();

        if (!property.isEmpty()) {
            property  = ".";
        }

        property  = fieldContext.getField().getName();

        if (List.class.isAssignableFrom(fieldContext.getField().getType())) {
            property  = "[]"; // How do I find the index of violation.getInvalidValue() within the list?
        }

        if (violation.getCauses() == null) {
            System.out.format("%s: %sn", property, violation.getMessage());
        } else {
            for (ConstraintViolation cause : violation.getCauses()) {
                printViolation(cause, property);
            }
        }
    }

    public static class Parent {
        @AssertValid
        public final List<Child> list = List.of(new Child("value"),
                new Child(null), new Child(null));
    }

    public static class Child {
        @NotNull
        public final String value;

        public Child(String value) {
            this.value = value;
        }
    }
}
 

Ответ №1:


В настоящее время это невозможно. Эту часть кода необходимо будет расширить, чтобы отслеживать индекс.

Ответ №2:

ConstraintViolation.getContextPath() был добавлен в 3.1.0