2011-07-25 36 views
4

我试图在命令对象中将一个弹簧形式与一组绑定。以弹簧形式绑定一组

在我的命令类AINSTANCE我定义设置为

private Set<BParameter> bParameters = new HashSet<BParameter>(); 

在JSP中我将它绑定为

<form:input path="bParameters " /> 
<form:input path="bParameters " /> 

作为其一个Java 设置因此可能会有很多领域。当我提交此表我试图让设置为:

Set<BParameter> bParameters = aInstance.getBParameters(); 

设置以0大小。

我也试图绑定为

<form:input path="bParameters[${itemsRow.index}].bParmvalues[0].parmValue" /> 

但有例外

Invalid property 'bParameters[0]' of bean class 

什么是我结合这个问题?

回答

1

在控制器中使用列表。

在视图中,你可以使用这个直的HTML(不知道这是否适用于春天标签)。

<input name="bParameters[{idx}].bParmvalues[0].parmValue" /> 
+1

通过在控制器中使用List <>而不是Set <>。问题解决了。 –

+0

这更像是一种解决方法。如果通过表单直接在JPA对象上工作,这是不可能的。这不应该有必要解决这个问题,但我一直没能找到解决方案 – Marc

1

它将成为一个数组,它将被转换成一个List;它也会实例化List实现 - 您不需要在Command对象中执行此操作。尝试使用

private List<String> bParameters; 

public void setBParameters(List<String> bParameters) { 
    this.bParameters= bParameters; 
} 
public List<String> getBParameters() { 
    return bParameters; 
} 

在您的Command对象中。这些值可能以字符串形式出现。

+0

通过在控制器中使用List <>而不是Set <>。问题解决了。 –

1

我没有问题

private Set<Types> typeses = new HashSet<Types>(0); 


    <form:textarea path="typeses" style="width:200px;height:150px"/> 

我使用Spring 3.5的结合。唯一的问题是,它出于某种原因在字段上留下[]标记

+0

谢谢请告诉我如何删除[]标记 –

+0

我也想知道这一点! :) – mjgirl

+1

当我绑定我所有的领域。 []标志自动删除。 –

0

我无法找到将Set设置为表单参数的方法。但是其他的解决方案建议,以“用列表,而不是”是不是对我不够好,因为如果该字段是JPA一个一对多与预先抓取关系的一部分,using List will cause duplicates

因此,最好的解决办法,我发现到目前为止是发布形式为JSON - 使用Ajax - 代替。下面是如何在JQuery的:

var person = // .. construct form object here 

$.ajax(url, { 
    method : 'post', 
    contentType : 'application/json', 
    data : JSON.stringify(person) 
}); 

请注意,您需要标记的contentType为application/json

在控制器端,可以绑定这个Java对象使用@RequestBody注释:

@RequestMapping(..) 
public void save(@RequestBody Person person) { 
    .. 
} 

更多的信息在这里:https://gerrydevstory.com/2013/08/14/posting-json-to-spring-mvc-controller/