java - Spring REST - RequestBody 内的数组仅包含一个元素

标签 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 和 parameters 的 JSON -在里面设置并从中创建相应的对象(然后通过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 看起来像这样(我用开发工具检查了这一点)在 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 收到 ObjectWithParameters: ServiceParameter [id=0, service=Service [id=1, name=testName, ....], key=bar, value =foo]”

我尝试了几件事,但没有运气......:( 有什么想法这有什么问题吗?

最佳答案

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

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

关于java - Spring REST - RequestBody 内的数组仅包含一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26548399/

相关文章:

javascript - 使用动态数据创建圆环图 c3.js

rest - 如何允许 POST 到 MVC5 Controller 以获取大量数据。

android - 从异步更新 UiThread 上的 TextView - Android

rest - 注册期间现有电子邮件的 422 或 409 状态代码

java - 选择哪种技术来创建网络聊天客户端?

java - Ant + Tomcat 部署 "failed to create task or type deploy"

java - csv文件中一列的最大长度是多少?

java - java BigDecimal 存储垃圾值的问题

json - 将 Postgres Json 数组包装在 Json 对象中

javascript - Angularjs - 从 json 数组中删除搜索到的对象