Вложенные группы проверки, 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 документация.

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