2015-09-07 2 views
3

Я пытаюсь выполнить вложенную проверку в приложении Spring.Вложенные группы проверки, Spring, JSR 303

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 
    } 

} 

Любые идеи, как сделать это?

Большое спасибо

+0

'@ Validated' предназначен для указания, какие группы использовать при проверке. Поэтому при отправке формы из Интернета проверяйте только те группы, которые указаны. Вы можете указать 0 или более групп для проверки. –

+0

Да, я не могу достичь того, что хочу с этой аннотацией, но я говорил об этом из-за своей философии. Мой вопрос не связан с формами или веб-сайтами, а только с каскадными группами валидации. –

+0

Это действительно связано с Spring, но о том, как работает проверка валов. Весна ничего не добавляет к этому. –

ответ

4

Я наконец нашел решение. На самом деле я неправильно понял, для чего был сделан @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.

+0

Отличный ответ. Спасибо. – Alex

Смежные вопросы