【问题标题】:Spring Data Rest + Spring Data Mongo - can't update numer of elements on list in objectSpring Data Rest + Spring Data Mongo - 无法更新对象列表中的元素数量
【发布时间】:2017-03-15 10:46:24
【问题描述】:

所以我在更新包含元素列表的对象时遇到了问题。我的对象定义:

public class Project {
    private String _id;
    private String name;
    private List<Pair> config;
}

还有 Pair 对象:

public class Pair {
     private String key;
     private String value;
}

我正在使用 Spring Rest 存储库来提供 Rest Api,所有内容都存储在 mongodb 中。只需使用简单的接口创建 mongoRepository

  @RepositoryRestResource(collectionResourceRel = "project", path = "projects")
  public interface ProjectRepository extends MongoRepository<Project, String>{
         Project findByName(String name);
  }

当我使用 json 创建项目对象时(将 POST 发送到 /projects):

 {
   "name": "test_project",
   "config": [{
     "key": "port",
     "value": "12"
   },{
     "key": "port2",
     "value": "123"
   }]
 }

我得到了正确的响应并且对象已经创建:

{
  "_id": "58c916fad76a3a186731ad28",
  "name": "test_project",
  "createdAt": "2017-03-15T10:27:06.295+0000",
  "modifiedAt": "2017-03-15T10:27:06.295+0000",
  "config":[
  {
    "key": "port",
    "value": "12"
  },
  {
    "key": "port2",
    "value": "123"
  }]
}

所以现在我想发送 PUT 来更新我的对象,但我得到了奇怪的结果:

例如发送以下带有 PUT 的正文到 localhost:8151/projects/58c916fad76a3a186731ad28

{
  "name": "test_project",
  "config": [{
    "key": "port",
    "value": "12"
  }]
}

所以我想从列表中删除一个元素。响应是(状态正常):

 {
  "_id": "58c916fad76a3a186731ad28",
  "name": "test_project",
  "createdAt": "2017-03-15T10:27:06.295+0000",
  "modifiedAt": "2017-03-15T10:27:06.295+0000",
  "config":[
  {
    "key": "port",
    "value": "12"
  },
  {
    "key": "port2",
    "value": "123"
  }]
}

所以元素的数量并没有改变我的预期(我的期望是新列表替换旧列表)。下一个测试: 我想在列表中添加一个新元素:

{
  "name": "test_project",
  "config": [{
    "key": "port",
    "value": "12"
  },{
    "key": "port1",
    "value": "13"
  },{
    "key": "port2",
    "value": "14"
  }]
}

给出以下结果:

 {
  "_id": "58c916fad76a3a186731ad28",
  "name": "test_project",
  "createdAt": "2017-03-15T10:27:06.295+0000",
  "modifiedAt": "2017-03-15T10:27:06.295+0000",
  "config":[
  {
    "key": "port",
    "value": "12"
  },
  {
    "key": "port1",
    "value": "13"
  }]
} 

尚未添加新元素,但第二个元素已更改。

它看起来不像 List mongo 将其保存为数组并且不能更改大小但可以更新元素。我说的对吗?

但是,如果它是真的,那么下一个测试应该返回相同的结果: 我正在发送配置的空列表,我希望我将有一个包含两个元素的列表。

{
  "name": "test_project",
  "config": []
}

但对我来说奇怪的是我得到了以下结果:

 {
  "_id": "58c916fad76a3a186731ad28",
  "name": "test_project",
  "createdAt": "2017-03-15T10:27:06.295+0000",
  "modifiedAt": "2017-03-15T10:27:06.295+0000",
  "config":[]
} 

所以元素的数量已经更新了。

说实话,我现在完全搞不懂它是如何工作的。谁能解释一下 Spring rest 存储库如何处理此操作并针对此问题提出适当的解决方案?

【问题讨论】:

  • 您使用的是什么 Spring Data Rest 版本?
  • 我使用的是 2.5.5 版本,但我也尝试了最新的 (2.6.1),但问题仍然存在。
  • 能不能用2.5.2版本试试?
  • 没有任何改变。同样的问题
  • 还有什么版本的spring-data-mongodb?

标签: java spring rest spring-data-mongodb spring-data-rest


【解决方案1】:

我也有同样的问题。作为一种解决方法,您可以发送 PATCH 请求。这会正确更新数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多