Spring mvc 使用隐藏字段将集合绑定到表单

Spring mvc 使用隐藏字段将集合绑定到表单,spring-mvc,hidden-field,Spring Mvc,Hidden Field,我正在尝试编辑一个产品。表单支持对象非常简单: private Integer productId; private String name; private Double price; private List<Integer> relatedProductList; //list of related product ids ...//getters/setter 但是在我的控制器中,表单支持对象有一个

我正在尝试编辑一个产品。表单支持对象非常简单:

private Integer           productId;
private String            name;
private Double            price;
private List<Integer>     relatedProductList;  //list of related product ids

...//getters/setter
但是在我的控制器中,表单支持对象有一个空的产品列表

@RequestMapping(method = RequestMethod.POST, value = "/edit.do", params = "editRelatedProducts")
public ModelAndView editRelatedProducts(@Valid @ModelAttribute ProductForm form, BindingResult result) {
    if (result.hasErrors()) {    
        ModelAndView view = new ModelAndView(VIEW_PRODUCT);
        setupCreateReferenceData(view , form);
        return view ;
    }

    ModelAndView editView = new ModelAndView(VIEW_EDIT_RELATED);

    //method to lookup the product ids and place product objects on model
    editView.addObject("relatedProducts",populateProductList(form.getRelatedProductList()));

    return editView ;
}
**但是form.getRelatedProductList为空

我可以通过使用隐藏字段并在jsp中设置值,在显示相关产品的循环中绕过此问题:

        <div>
            <table id="relProductTbl" class="tablesorter">
              <thead>
                 ...
              </thead>
              <tbody>
                  <c:forEach var="prod" items="${relatedProducts}" varStatus="row">
                        <tr>
                            <input id="relatedProductList" name="relatedProductList" type="hidden" value="${prod.productId}"/>
                             ...
                        </tr>
                  </c:forEach>
              </tbody>
            </table>
        </div>
突然间,表单.getRelatedProductList()被正确填充

有人知道为什么在使用springs form:hidden标记时,postdatacontractlist[200408200417]不能正确绑定到表单吗?这是一个bug还是预期的行为。对我来说似乎很奇怪,我只是想把它扔出去,看看我是否做错了,或者它是否能帮助其他人


谢谢。

我知道这很旧,但让我简单地回答一下:

在生成的HTML
中观察到的
relatedProductList[200408,200417]
只是
relatedProductList.toString()
的值,它反过来使用
java.util.AbstractCollection
中的默认实现。格式如下:
[…,…,…]
。SpringMVC使用toString()方法获取表单输入字段的表示,这非常简单:它需要一个普通字符串

这并不能保证它以后能够解析相同的字符串。显然,如果不能,它只会将变量绑定为null

您后来所做的(直接使用
)实际上更像是一种黑客行为,但我习惯于在使用SpringMVC时有时不得不做这样的事情,因为在功能上存在一些漏洞

通常,如果有多个表单字段具有相同的名称,它们都会嵌入到POST数据中。如果您检查POST数据字符串,您将在那里找到类似于
relatedProductList=200408&relatedProductList=200417的内容。现在,当SpringMVC在解析POST数据时发现这种情况时,它会尝试将其映射到当前的目标变量。如果该目标变量是
java.util.Collection
(与您的情况相同),则它使用POST数据中的值作为收集元素,这非常直观

再举一个例子,如果目标变量的类型为
String
,它将按如下方式填充它:
“200408200417”

的可能重复项
relatedProductList    [200408, 200417]
@RequestMapping(method = RequestMethod.POST, value = "/edit.do", params = "editRelatedProducts")
public ModelAndView editRelatedProducts(@Valid @ModelAttribute ProductForm form, BindingResult result) {
    if (result.hasErrors()) {    
        ModelAndView view = new ModelAndView(VIEW_PRODUCT);
        setupCreateReferenceData(view , form);
        return view ;
    }

    ModelAndView editView = new ModelAndView(VIEW_EDIT_RELATED);

    //method to lookup the product ids and place product objects on model
    editView.addObject("relatedProducts",populateProductList(form.getRelatedProductList()));

    return editView ;
}
        <div>
            <table id="relProductTbl" class="tablesorter">
              <thead>
                 ...
              </thead>
              <tbody>
                  <c:forEach var="prod" items="${relatedProducts}" varStatus="row">
                        <tr>
                            <input id="relatedProductList" name="relatedProductList" type="hidden" value="${prod.productId}"/>
                             ...
                        </tr>
                  </c:forEach>
              </tbody>
            </table>
        </div>
<input id="relatedProductList" name="relatedProductList" type="hidden" value="200408"/>
...
<input id="relatedProductList" name="relatedProductList" type="hidden" value="200417"/>
relatedProductList    200408
relatedProductList    200417