2015-09-07 109 views
3

我试图做一个嵌套的验证我的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; 

} 

我已经从javax.validation包看过@Valid,但它不支持组。我也检查了Spring的@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

这并不是真正相关的,而是与bean验证的工作方式有关。 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 
    } 

} 

如果我的孩子现场“更远”,第一个相关的验证错误代码检测验证错误(见FieldError.codes)将是'NotBlank.Parent.afield'。

我应该有更好的检查@Valid文档。

+0

优秀的答案。谢谢。 – Alex