如何从 Spring 基于超媒体的 RESTful 前端 MongoDB 数据库中 POST 具有手动 ID 的文档?

How to POST a document with manual id in MongoDB database from Spring hypermedia-based RESTful front end?

我正在遵循这个 spring 指南: https://spring.io/guides/gs/accessing-mongodb-data-rest/

一切都很完美,但是如果我想 POST 一个带有手动 id 的文档,我做不到。

这是我所做的一切:

我通过命令 db.person.insert({"_id": "111111", "firstName" : "Vikas", "lastName" : "Prasad"});

从 Mongo shell 插入了一份文件

这很好用,如果我在 Postman http://localhost:8080/people 处执行 GET,我可以在响应中看到 ID 为 111111 的人员文档,其 self href 为 http://localhost:8080/people/111111

但是,如果我在 http://localhost:8080/people 发送来自邮递员的 POST 请求,正文为 {"_id": "222222", "firstName" : "Aadish", "lastName" : "Patodi"},文档将使用自动 ID 而不是 222222 插入.因此,显然我无法通过在 http://localhost:8080/people/222222 处执行 GET 来访问此文档,这与我使用 shell 中的 insert() 插入具有手动 ID 的文档时的情况不同。相反,我必须在 http://localhost:8080/people/57bc29ada3fab115cc9b546b 处点击 GET 才能获取第二个文档。

只是为了检查我是否再次 POSTing {"_id": "222222", "firstName" : "Aadish", "lastName" : "Patodi"},它再次插入到一个新的自动生成的 ID:http://localhost:8080/people/57bc2bdaa3fab115cc9b546c。这意味着 MongoDB 甚至没有查看 _id,否则它一定会抛出 duplicate key error.

我尝试搜索各种来源。我所能找到的只是在后端 JAVA 中单独实现数据访问代码并调用相应的 MongoDB 方法。

我的问题是:

就像在给定的教程中一样,他们在执行每个操作时都没有定义任何 JAVA 后端代码以从 MongoDB 访问自动 ID 文档的数据,有没有办法做同样的事情手动身份证件? 或者只是为了这个用例我必须在后端实现数据访问代码?

我正在使用 CorsFilter 来处理跨源请求。

编辑:

下面是Person class:

package hello;

import org.springframework.data.annotation.Id;

public class Person {

    @Id private String id;

    private String firstName;
    private String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

我试过:

-> 为 id 属性添加 getter 和 setter

-> 将 id 重命名为 employeeNumber

-> 将 id 重命名为 employeeNumber 并为 employeeNumber

添加 getter 和 setter

None以上三个解决问题。

最后,我通过将 id 重命名为 _id 并在 Person [=16] 中添加 getter 和 setter 使其正常工作=].

package hello;

import org.springframework.data.annotation.Id;

public class Person {

    @Id private String _id;

    private String firstName;
    private String lastName;

    public String get_id() {
        return _id;
    }

    public void set_id(String _id) {
        this._id = _id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

如评论中所述,您的 _id 字段似乎未正确映射。你能检查 _id 是否在 pojo 中正确映射了吗?