Spring Data Rest + Spring Data Mongo - 不能更新对象列表中元素的数量

时间:2017-03-15 10:46:25

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

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

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存储库如何处理这个动作并为这个问题提出一个合适的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。作为解决方法,您可以发送PATCH请求。这会正确更新阵列。