5

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;

}

私はすでに javax.validation パッケージから @Valid を見ましたが、グループをサポートしていません。春の@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
   }

}

それを行う方法はありますか?

どうもありがとう

4

1 に答える 1

6

私は最終的に解決策を見つけました。実際、私は何@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ドキュメント をよく確認する必要がありました。

于 2015-09-07T14:18:27.067 に答える