web-dev-qa-db-ja.com

SpringMVCでコレクション属性をフォームにバインドするにはどうすればよいですか

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に何かありますか?

16
agnul

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

account [2]インデックス付きプロパティアカウントの3番目の要素を示します。インデックス付きプロパティは、配列、リスト、またはその他の自然に順序付けられたコレクション(強調)のいずれかになります。

おそらく1つのアプローチは、Setを返すのではなく、Set.toArray()を返すゲッターをオブジェクトに追加することです。次に、items属性が配列を参照します。もちろん、順序に依存することはできません。

5
Jacob Mattison

ここで完璧な解決策が見つかりました: 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));
2
sab

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

 <c:forEach items="${items}" var="i" varStatus="itemsRow">
        <input name="items[${itemsRow.index}].fieldName" type="text"/>
    </c:forEach>
 <form:errors path="items" />
1
zmf

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

1
Alex Marshall