Spring REST - RequestBody中的数组只包含一个Element

时间:2014-10-24 12:59:25

标签: java json rest spring-mvc post

这是我的第一个问题,所以请不要太苛刻:)

在我的spring-mvc驱动的REST后端里面,我创建了两个这样的实体:

@Entity
public class ObjectWithParameters implements Serializable {

private long id;
private String name;
private String description;
private String content;

@OneToMany(fetch = FetchType.EAGER, mappedBy = "service")
@JsonManagedReference
private Set<Parameter> parameters = new HashSet<Parameter>();

...

public Set<Parameter> getParameters() {
  return parameters;
}

public void setParameters(Set<Parameter> parameters) {
  this.parameters = parameters;
}

...

@Entity
public class Parameter implements Serializable {

private long id;
private String key;
private String value;

@ManyToOne
@JsonBackReference
private RestService service;

...

ObjectWithParameters -Entity的@RestController中,我尝试创建一个@RequestMapping,它使用包含 ObjectWithParameters -Object的JSON和参数 -set在里面并从中创建相应的对象(然后通过hibernate将其保存到mysql数据库中)。

@RequestMapping(value = "/rest/object-with-parameters", method = RequestMethod.POST)
public void create(@RequestBody ObjectWithParameters objectWithParameters) {

    for (Parameter param : objectWithParameters.getParameters()) {
        log.debug("Param inside received ObjectWithParameters: {}", param);
    }

    ...
}

For-Loop只运行一次,如果我记录或保存(或者其他),参数集只包含一个参数对象......即使RequestBody中的JSON看起来像这样(我用开发工具检查过这个) in chrome):

{
  "id": 1,
  "name": "testName",
  "description": "testDescription",
  "content": "testContent",
  "parameters": [
    {
      "value": "foo",
      "key": "bar"
    },
    {
      "value": "foo2",
      "key": "bar2"
    },
    {
      "value": "foo3",
      "key": "bar3"
    }
  ]
}

在这种情况下,显示的for循环内部的日志输出仅为

"01:54:52-800 [DEBUG] ParamInside received ObjectWithParameters: ServiceParameter [id=0, service=Service [id=1, name=testName, ....], key=bar, value=foo]"

我尝试了几件事,但没有运气...... :( 任何想法都有错吗?

1 个答案:

答案 0 :(得分:1)

假设:看起来您已在Parameter#id实例变量上实现了Parameter.hashCode()和equals()。因为您正在创建一个对象,所以所有参数的Parameter#id都设置为0。您将它们存储在一个Set中,该Set仅包含发送的第一个参数,因为您的hashCode等于认为所有那些id = 0的参数都是相同的。

修复hashCode / equals以处理未保存的对象或使用List容器而不是Set。