1

次のセットアップがあります。

public class MyController extends BaseFormController {
  public MyController() {
    setCommandClass(MyObject.class);
    setCommandName("object");
    setSessionForm("true);
  }

  @Override
  protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors)
        throws Exception {
    MyObject o = (MyObject) command;
    ...
  }

MyObject には MyOtherObject 型のメンバーがあり、これには次のメンバーがありますSet<String> foo

public class MyObject {
  ...
  MyOtherObject otherObject;
  ...
}

public class MyOtherObject {
  ...
  Set<String> foo = new HashSet<String>();
  ...
}

対応するすべてのセッターとゲッターが実装されています。次に、jsp で記述されたビューを取得しました。

<form:form method="POST" action="" commandName="object" ...
...
    <form:select path="otherObject.foo" multiple="multiple" size="4">
      <c:forEach var="entry" items="${listOfItems}">
        <option value="${entry.size}" <c:if test="${!entry.enabled}">disabled</c:if>>${entry.name}</option>
      </c:forEach>
    </form:select>
 ...
 </form:form>

size私の目標は、リスト内のいくつかのエントリの s を setにマップすることfooです。

フォーム内の他のすべてのエントリは、ユーザーが入力した値に設定されるため、全体的な構文は正しいはずです。ただし、object.otherObject.foo にマップする必要があるこの複数選択フォームになると、コントローラーは、ビューに値がまったく提供されていないかのように動作します。つまり、ヒットする前にボックスから複数の値を選択したとしてもです。送信commandしても、コントローラー内のオブジェクトはまだ空の otherObject.foo メンバーを取得します。

これを引き起こしている可能性のあるアイデアはありますか?

PSまたSet<String> foo、MyObjectに直接追加してpath=""、ビューで使用しようとしました。それでもうまくいきませんでした。

4

2 に答える 2

0

いろいろ調べた結果、解決策が見つかりましたString[] foo。春がこの時代に「昔ながらの」配列を使用する理由はわかりませんが、明らかにそうです。

于 2013-06-10T06:27:51.223 に答える