4

私は JSR 303 を使用しており、多くの注釈を書いているので、カスタム制約を機能させるプロセスに精通しています。

エレガントに解決できるかどうかわからない問題に直面しました。ここにあるオブジェクトは説明用です。だから私は子供のリストを持つ祖父母オブジェクトを持っています。各子には、独自の子のリストがあります (明らかに、孫から祖父母まで)。このリストのサイズは @Size で制限できます。ただし、祖父母からの (孫) 子の数の合計サイズを制限する必要があるため、祖父母インスタンスを検証する場合、すべての子で 50 人の孫に制限されます。奇妙な例、私は知っています:-)

まず、GrandParent 内の子リストの子リスト内のすべての要素を単純にカウントするメソッドを祖父母内に作成し、それに単純な @Size 注釈を追加しました。これは少し醜く感じます - いくつかの検証を提供するためだけにあるこのようなメソッドを追加します。それは、JSR が解決すべきことの一部ではありませんでしたか?

または - 次のようなカスタム アノテーションを作成します。

@CustomListSize(listName="children.children", min=0, max=50)
Grandparent
    --> List<Child> children
        @Size(min=0, max=5)
        -->List<Child> children
    --> List<Object> list1
        -->List<Object> list2

私は明らかにリフレクション/プロパティ記述子でこれを取得し、最小値/最大値に対してチェックできます。それはOKですか、それともJSR 303に欠けているより良い方法がありますか。これも機能しますが、より多くのコードが必要であり、まだ理想的ではありません。

最後に、 list2 のエントリ数について同じチェックを行いたい場合はどうすればよいでしょうか? 私は CustomListSize を繰り返すことができないので、それを行う方法 - 内部リストがありますか?

ありがとう

クリス

4

2 に答える 2

1

祖父母オブジェクトのカスタムバリデーターは良いアプローチだと思います。

@InnerListSize(lists = {"list1", list2"}, min=0, max=50)
class GrandParent{
   List list1;
   List list2;

}

リフレクションを使用してリストを取得できます。それらがあれば、全体のサイズを簡単に計算できます。バリデータクラスは特に複雑ではありません。

于 2012-06-12T22:16:14.147 に答える
0

祖父母のカスタム バリデータを作成する

public class GrandParentValidator は ConstraintValidator を実装します {

@Override
public boolean isValid(GrandParent bean,
        ConstraintValidatorContext ctx) {            
          //Count the number of Grandkids
          int noOfGrandKids  = 0 ;
          for (Children child :bean.getAllChild() ){
              noOfGrandKids += child.getAllChild().size ;
          }

          if (int noOfGrandKids  > 50){ 
            ctx.disableDefaultConstraintViolation();
            ctx.buildConstraintViolationWithTemplate("Invalid -More than 50 Grandkids found").addConstraintViolation();
            return false ;
          }
         return true ;
      }

}

于 2012-12-12T21:47:02.250 に答える