JSR303 - применить все группы проверки, определенные в последовательности

У меня есть боб, на котором я хотел бы сделать условную проверку. Для этой цели я определил DefaultGroupSequenceProvider<MyObject> который возвращает список групп для проверки.

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

Я думаю, что для этого не нужен пример кода, но если я ошибаюсь, я буду рад предоставить его.

Я следовал этому http://kh-yiu.blogspot.com/2014/04/conditional-bean-validation-using.html при создании последовательности. Мы используем Spring, если это имеет значение.

Это замечание, это работает, так как невозможно, чтобы неверный бин был объявлен действительным. Но если у пользователя есть входные данные, которые нарушают 3 ограничения, и я возвращаю 2 ошибки, пользователь получит еще одну ошибку в последнем поле, как только первые исправятся. Не совсем удобно.

Пример:

боб

@GroupSequenceProvider(BeanSequenceProvider.class)
public class MyBean {
    @NotEmpty
    private String name;

    @NotNull
    private MyType type;

    @NotEmpty(groups = Special.class)
    private String lastName;

    // Getters and setters        
}

Тип enum

public enum MyType {
    FIRST, SECOND
}

поставщик

public class BeanSequenceProvider implements DefaultGroupSequenceProvider<MyBean> {
    @Override
    public List<Class<?>> getValidationGroups(final MyBean object) {
        final List<Class<?>> classes = new ArrayList<>();

        classes.add(MyBean.class);

        if (object != null && object.getType() == MyType.SECOND) {
            classes.add(Special.class);
        }

        return classes;
    }

Групповая аннотация

public interface Special {
}

Тестовый класс

public class MyBeanTest {

    private static Validator validator;

    private MyBean objectUnderTest;

    @BeforeClass
    public static void setUpOnce() throws Exception {
        final ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();

        validator = validatorFactory.getValidator();
    }

    @Before
    public void setUp() throws Exception {
        objectUnderTest = new MyBean();

        objectUnderTest.setName("Simen");
        objectUnderTest.setType(MyType.FIRST);
        objectUnderTest.setLastName("Woop");
    }

    @Test
    public void testValid() throws Exception {
        assertThat(validator.validate(objectUnderTest), is(empty()));
    }

    @Test
    public void testMissingName() throws Exception {
        objectUnderTest.setName(null);

        assertThat(validator.validate(objectUnderTest), hasSize(1));
    }

    @Test
    public void testMissingLastName() throws Exception {
        objectUnderTest.setLastName(null);

        assertThat(validator.validate(objectUnderTest), is(empty()));

        objectUnderTest.setType(MyType.SECOND);

        assertThat(validator.validate(objectUnderTest), hasSize(1));

        objectUnderTest.setName(null);

        assertThat(validator.validate(objectUnderTest), hasSize(2));
    }

Это последнее утверждение не выполнено, поскольку есть одно нарушение, а не 2. Поскольку ограничение нарушается в группе по умолчанию, Special группа не нарушена.

1 ответ

Хорошо, теперь я понимаю ваш вопрос. Ответ заключается в том, что проверка прекращается, если в данной группе есть одно или несколько нарушений. Чтобы процитировать спецификации:

Обработка группы определена в разделе 4.6, "Процедура валидации"; если одна из групп, обработанных в последовательности, генерирует одно или несколько нарушений ограничений, группы, следующие в последовательности, не должны обрабатываться. Это гарантирует, что набор ограничений оценивается только в том случае, если допустим другой набор ограничений.

См. Http://beanvalidation.org/1.1/spec/#constraintdeclarationvalidationprocess-groupsequence-groupsequence

В вашем случае имеет место нарушение Default группа, которая означает Special группа никогда не проверяется.

Другие вопросы по тегам