Вложенные группы проверки, Spring, JSR 303
Я пытаюсь сделать вложенную проверку в моем приложении Spring.
public class Parent{
public interface MyGroup{}
@NotNull(groups = MyGroup.class)
private Child child;
// getters and setters omited
}
public class Child{
public interface OptionalGroup {}
@NotBlank(groups = OptionalGroup.class)
private String aField;
}
Я уже посмотрел на @Valid из пакета javax.validation, но он не поддерживает группу. Я также проверил аннотацию @Validated от весны, но не могу применить ее к полю.
Я хочу сделать что-то вроде:
public class Parent{
public interface MyGroup{}
@NotNull(groups = MyGroup.class)
@CascadeValidate(groups = MyGroup.class, cascadeGroups = OptionalGroup.class)
// 'groups' correspond to parent group and 'cascadeGroups' to a group that needs to be apply to the Child field.
private Child child;
}
И тогда я могу прагматично сделать, где я хочу:
@Inject SmartValidator validator;
public void validationMethod(Parent parent, boolean condition) throws ValidationException {
if(condition){
MapBindingResult errors= new MapBindingResult(new HashMap<>(), target.getClass().getSimpleName());
validator.validate(parent, errors, Parent.MyGroup.class); // validate all constraints associated to MyGroup
if(errors.hasErrors()) throw new ValidationException(errors); // A custom exception
}
}
Есть идеи, как это сделать?
большое спасибо
1 ответ
Решение
Я наконец нашел решение. На самом деле я не понял, что @Valid
был сделан для.
Ключ должен объявить ту же группу для родительского и дочернего атрибута.
Решение:
public class Parent{
public interface MyGroup{}
@NotNull(groups = MyGroup.class)
@Valid // This annotation will launch nested validation
private Child child;
// getters and setters omited
}
public class Child{
@NotBlank(groups = Parent.MyGroup.class) // Declare same group
private String aField;
}
В этом случае, когда я делаю:
@Inject SmartValidator validator;
public void validationMethod(Parent parent, boolean condition) throws ValidationException {
if(condition){
MapBindingResult errors= new MapBindingResult(new HashMap<>(), target.getClass().getSimpleName());
// validate all constraints associated to MyGroup (even in my nested objects)
validator.validate(parent, errors, Parent.MyGroup.class);
if(errors.hasErrors()) throw new ValidationException(errors); // A custom exception
}
}
Если в моем дочернем поле "aField" обнаружена ошибка проверки, первым связанным кодом ошибки проверки (см. FieldError.codes) будет "NotBlank.Parent.afield".
Я должен был лучше проверить @Valid
документация.