Bind a set in a spring form

2019-06-28 05:27发布

问题:

I am trying to bind a spring form with a set in the command object.

In my command class AInstance I defined set as

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

In jsp I bind it as

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

As its a Java Set so there may be many fields. When I submit this form I tried to get Set as:

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

I got Set with a 0 size.

I also tried to bind as

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

but got exception

Invalid property 'bParameters[0]' of bean class

What is the problem with my binding?

回答1:

Use an List in the controller.

In the view you can use this straight html (not sure if this works with spring tags).

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


回答2:

Its going to be an array, which Spring will translate into a List; it will also instantiate the List implementation - you don't need to do that in your Command object. Try using

private List<String> bParameters;

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

in your Command object. Those values are probably coming in as Strings.



回答3:

I don't have problems binding as

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


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

I use Spring 3.5. The only problem with this is, that it leaves []-marks on the field for some reason



回答4:

I cannot find a way to bind Set into form parameters. However other solutions suggesting to "use list instead" is not good enough for me because if the field is part of JPA one-to-many relationship with eager fetching, using List will cause duplicates

Hence the best solution I find so far is by posting the form as JSON -- using Ajax -- instead. Here's how in JQuery:

var person = // .. construct form object here

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

Note that you need to mark the contentType as application/json

On the controller side, you can bind this to a Java object by using @RequestBody annotation:

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

More info here: https://gerrydevstory.com/2013/08/14/posting-json-to-spring-mvc-controller/