如何从 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
才能获取第二个文档。
只是为了检查我是否再次 POST
ing {"_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 中正确映射了吗?
我正在遵循这个 spring 指南: https://spring.io/guides/gs/accessing-mongodb-data-rest/
一切都很完美,但是如果我想 POST 一个带有手动 id 的文档,我做不到。
这是我所做的一切:
我通过命令 db.person.insert({"_id": "111111", "firstName" : "Vikas", "lastName" : "Prasad"});
这很好用,如果我在 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
才能获取第二个文档。
只是为了检查我是否再次 POST
ing {"_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
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 中正确映射了吗?