0

クラス レベルの注釈制約を使用したいと思います。ただし、内部制約を自動的に検証することはできません。この手法に検証グループを組み込むために、一部を支援したいと思います。

@ConstraintA({
  @ConstraintB(stuff),
  @ConstraintB(stuff, groups=SomeGroup.class)
})
public class Form{
}

私は現在、そのように制約をトリガーしています。

 if(constraint instanceof ConstraintB){
      new ConstraintBValidator().isValid(target, context);
 }

ただし、これは明らかにひどいものです。最終的には AnnotationInvocationHandler.invoke() メソッドを呼び出して isValid メソッドをトリガーするようにリファクタリングしますが、まだ少し先です。

私の問題は、すべての ConstraintB インスタンスが ConstraintA に渡されることです。適切なグループを持つものだけが ConstraintA に渡されることを望みます。この能力が存在するとは思えないので、どのグループがトリガーされる必要があり、どのグループがトリガーされないかをどのように識別できますか?

どのグループをトリガーするかを指定するオブジェクトがデバッグに表示されませんか?

何か案は?

4

1 に答える 1

0

このタイプの検証を可能にする JSR 303 仕様のパターンを見つけました。親の検証ルールを実行せず、ネストされた検証のみを満たす再帰的なパターンです。これは非常に便利です。ネストされた検証ルールは条件付きで他のプロパティ値に基づいているため、ネストされた jsr303 アノテーションを使用した条件付き検証が可能です。

 @Documented
 @Constraint(validatedBy = ZipCodeValidator.class)
 @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
 @Retention(RUNTIME)
 public @interface ZipCode {
 String countryCode();
 String message() default "{com.acme.constraint.ZipCode.message}";
 Class<?>[] groups() default {};
 Class<? extends Payload>[] payload() default {};
 /**
 * Defines several @ZipCode annotations on the same element
 * @see (@link ZipCode}
 */ 
 @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
 @Retention(RUNTIME)
 @Documented
 @interface List {
 ZipCode[] value();
 }

私自身の検証は次のようなものです:

 @RequiredIf ({
 @RequiredIf(ifField="field1", matches={"true","somethingElse"}, requiredField="anotherField", andDisplay="error.code.msg"),
 @RequiredIf(ifField="field2", matches={"true","somethingElse"}, requiredField="anotherField", andDisplay="error.code.msg")
  })
于 2012-02-18T13:01:31.653 に答える