所以我在更新包含元素列表的对象时遇到了问题。我的对象定义:
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存储库如何处理这个动作并为这个问题提出一个合适的解决方案吗?
答案 0 :(得分:0)
我遇到了同样的问题。作为解决方法,您可以发送PATCH请求。这会正确更新阵列。