16

Spring-MVC を使用して、モデル オブジェクトの 1 つをフォームのフィールドにバインドしようとしています。モデル オブジェクトの属性の 1 つが順序付けられていないコレクションであることを除いて、すべて正常に動作します。のようなことをする

    <c:forEach items="${m.items}" var="i" varStatus="itemsRow">
      <form:input path="items[${itemsRow.index}]"/>
    </c:forEach>
    <form:errors path="items" />

List タイプのプロパティでは問題なく動作しますが、Set では、送信時に入力フィールドの内容をオブジェクト属性にバインドしようとするとエラーがスローされます。

セットですぐに使えるSpringの何かがありますか?

4

6 に答える 6

5

順序付けられたコレクションでなければならないと思います。たとえば、Spring リファレンスには、プロパティを参照する方法について説明しているチャートがあります。それは言います:

account[2] インデックス付きプロパティ account の 3 番目の要素を示します。インデックス付きプロパティは、配列、リスト、またはその他の自然に順序付けられた コレクションの型にすることができます (theirs を強調)

おそらく、Set を返すのではなく、Set.toArray() を返す getter をオブジェクトに追加するのが 1 つの方法でしょう。その後、items 属性は配列を参照します。もちろん、順序に依存することはできません。

于 2008-11-12T16:32:34.460 に答える
3

セットで動作しないのは、セットの順番が保証されていないためだと思います。ポストの最初のオブジェクトにバインドしようとすると、それがそのリストの最初のオブジェクトではなかった可能性があります。たとえば、items[0]はGETとPOSTで同じではない場合があります。

したがって、SortedSetやTreeSetなど、順序付けられたSetの実装を使用する場合は正常に機能するはずです。

于 2008-12-01T15:52:07.387 に答える
2

ここで完璧な解決策を見つけました:http://forum.springsource.org/showthread.php?45312-Submitting-arrays

一般的な考え方 - commons-collections メソッドを使用してリストを初期化する:

private List someList = LazyList.decorate(new ArrayList(), FactoryUtils.instantiateFactory(com.abc.xyz.SomeClass.class));
于 2012-10-26T10:05:12.083 に答える
1

これがどのようにバインドされるかについては明確ではありませんが、私の目的には合っています。

 <c:forEach items="${items}" var="i" varStatus="itemsRow">
        <input name="items[${itemsRow.index}].fieldName" type="text"/>
    </c:forEach>
 <form:errors path="items" />
于 2008-11-12T16:40:27.503 に答える
1

ジョブを実行するために独自のカスタム エディターを作成してから、エディターをフォームのコントローラーに登録することができます。そのように Set 内の要素にインデックスを付けることに煩わされる必要はありません。前述のように、要素を並べ替える方法があれば、SortedSet を使用してセット内の順序を確保できます。

于 2008-12-02T16:07:18.883 に答える
-1

オブジェクトの ID への数値参照を使用し、適切な Converter 実装が登録されている場合は、セミコロンで区切られたリストを使用できます。

POST データのリーダーボード = 1,2

コンバーターの実装 (JSON のものは無視してください)

    public final class LeaderboardConverter extends JsonDeserializer<Leaderboard> implements Converter<String, Leaderboard>
    {
        public Leaderboard convert(String source) throws IllegalArgumentException
        {
            Leaderboard activity = new Leaderboard();
            activity.setId(new Integer(source));
            return activity;
        }


        public Leaderboard deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException
        {
            return convert(jp.getText());
        }

}
于 2011-04-20T15:33:39.397 に答える