Bean階層のプロパティを設定する簡単な方法として、ユニットと統合テストでCommons JXPathを使い始めました。リスト/コレクションのエントリをきれいに設定するためのJXPathの入手方法
JXPathを「きれいに」使用できないシナリオの1つは、リストのエントリを設定することです。
JXPathが「明白なこと」をするのは本当に好きなので、リストのエントリ「[1]」を設定しようとすると(1ベースのインデックスを使用することを選んだのは奇妙です)、少なくとも1つのエントリを持つように基になるリストを構成します。私が見たことから、これは起こらないので、私はそれを手動で行う必要があります。これは、さまざまな理由のカップルのため、動作しません
JXPathContext context = JXPathContext.newContext(request);
context.setValue("foo", new Foo());
context.setValue("foo/subscriberNumber", "1234567890");
context.setValue("foo/bar", new Bar());
context.setValue("foo/bar/numbers[1]", "123"); // this fails
:
はたとえば、ここに私が書きたいのですがいくつかのコードです。
最初の問題は、 "numbers"リストのプロパティがnullになることです。
JXPathContext context = JXPathContext.newContext(request);
context.setValue("foo", new Foo());
context.setValue("foo/subscriberNumber", "1234567890");
context.setValue("foo/bar", new Bar());
context.setValue("foo/bar/numbers", new ArrayList<String>());
context.setValue("foo/bar/numbers[1]", "123");
それともAbstractFactoryを登録し、代わりに「createPathAndSetValueを()」を使用できます。私はこのようなことに対処することができます。
ただし、リストが存在する可能性がありますが、サイズがゼロであり、0番目のエントリにアクセスできないため、これは失敗します。
私はこのような何かをすることを強制しています:
JXPathContext context = JXPathContext.newContext(request);
context.setValue("foo", new Foo());
context.setValue("foo/subscriberNumber", "1234567890");
context.setValue("foo/bar", new Bar());
context.setValue("foo/bar/numbers", Arrays.asList(""));
context.setValue("foo/bar/numbers[1]", "123");
私は最初のもの以外にも、リスト内の他のエントリを設定する必要がある場合、私はより多くのダミーエントリを持つリストを初期化する必要があります。
また、私はWTFを鎮圧するためにこれを行うすべての場所にコメントを追加する責任があると感じます。
これを行うクリーナー方法はありますか?