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 类型的成员,而 MyOtherObject 又有一个成员Set<String> foo

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

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

并且实现了所有对应的setter和getter。然后我有一个用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 的多选表单时,控制器的行为就像视图中没有提供任何值一样,即即使我要在点击之前从框中选择多个值提交,commandController 中的对象仍然获得一个空的 otherObject.foo 成员。

有什么想法可能导致这种情况吗?

PS 我还尝试Set<String> foo直接在 MyObject 中添加一个并在path=""视图中使用它。它仍然没有成功。

4

2 回答 2

0

经过大量的探索后,我找到了解决方案 - foo 必须被声明为String[] foo并且从那里开始 spring 照料了所有其余的事情,正如预期的那样。打败我为什么春天会在这个时代使用“老式”数组,但显然确实如此。

于 2013-06-10T06:27:51.223 回答
0

您是否覆盖了 formBackingObject 方法?如果是,您是否将 MyOtherObject 分配给 MyObject?

于 2013-06-07T11:57:35.580 回答