【问题标题】:Spring REST - Array inside RequestBody only contains one ElementSpring REST - RequestBody 中的数组仅包含一个元素
【发布时间】:2014-12-20 07:40:43
【问题描述】:

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

在我的 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,它采用 JSON,其中包含 ObjectWithParameters-Object 和 parameters -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 看起来像这样(我用开发工具检查了这个)铬):

{
  "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]"

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

【问题讨论】:

  • 也许参数 hashCode()/equals() 有什么需要修复的?

标签: java json rest spring-mvc post


【解决方案1】:

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

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

【讨论】:

  • 这正是问题所在!我现在觉得很愚蠢......完全忽略了这一点,因为在创建这些实体的开始它是一个列表而不是一个集合。谢谢! :)
猜你喜欢
  • 2021-06-29
  • 2021-03-05
  • 2014-05-02
  • 2012-04-12
  • 2021-01-30
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多