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, "Процедура валидации"; если одна из групп, обработанных в последовательности, генерирует одно или несколько нарушений ограничений, группы, следующие в последовательности, не должны обрабатываться. Это гарантирует, что набор ограничений оценивается только в том случае, если допустим другой набор ограничений.
В вашем случае имеет место нарушение Default
группа, которая означает Special
группа никогда не проверяется.