2016-08-23 25 views
0

我下面這個春天指南: https://spring.io/guides/gs/accessing-mongodb-data-rest/如何使用Spring基於超媒體的RESTful前端在MongoDB數據庫中使用手動標識發佈文檔?

一切都是完美的,但是如果我要發佈具有手動編號的文件,我不能這樣做。

以下是我所做的:

我插入一個文件從蒙戈外殼由命令db.person.insert({"_id": "111111", "firstName" : "Vikas", "lastName" : "Prasad"});

這工作得很好,如果我在http://localhost:8080/people從郵差做GET,我可以看到的人用在具有自HREF響應ID 111111文檔作爲http://localhost:8080/people/111111

但是,如果我送從郵遞員POST請求在http://localhost:8080/people與身體爲{"_id": "222222", "firstName" : "Aadish", "lastName" : "Patodi"},第e文檔正在插入自動ID而不是222222。因爲很明顯,我無法通過執行GEThttp://localhost:8080/people/222222來訪問此文檔,這與我在shell中使用insert()插入帶有手動標識的文檔的情況不同。相反,我必須點擊GEThttp://localhost:8080/people/57bc29ada3fab115cc9b546b才能獲取此第二個文檔。

只是爲了檢查我是否POST再次{"_id": "222222", "firstName" : "Aadish", "lastName" : "Patodi"},它再次插入一個新的自動生成的id:http://localhost:8080/people/57bc2bdaa3fab115cc9b546c。這意味着MongoDB甚至沒有在看_id,否則它一定會拋出duplicate key error

我試着搜索各種來源。我所能找到的是在後端分別在JAVA中實現數據訪問代碼並調用相應的MongoDB方法。

我的問題是:

就像在他們沒有定義任何Java後端代碼從MongoDB的數據訪問的自動識別文件執行每一個操作給定的教程,有沒有辦法做手工相同身份證件? 或者僅僅爲了這個用例,我必須在後端實現數據訪問代碼?

我正在使用CorsFilter來處理交叉來源請求。

編輯:

下面是Person類:

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; 
    } 
} 

我曾嘗試:

- >添加getter和setter方法id屬性

- >重命名idemployeeNumber

- >重命名idemployeeNumber並添加getter和setter爲employeeNumber

無上述三項解決的問題。

+0

可以粘貼你的代碼嗎?一個你將集合保存到db的地方,還有一個地方是你聲明人pojo將春天的id字段映射到mongodb的地方? – user641887

+0

看起來像你的_id字段映射不正確。 – user641887

+0

從指南中可以看出,沒有明確的將收集保存到分貝。這個集合是在Postman的第一個'POST'或第一個'insert()'從shell中創建的,以先發生者爲準。 人pojo與在指南中相同。但是我添加了一個編輯。 請看看。 –

回答

0

正如討論的評論,看起來像你的_id字段映射不正確。你能否檢查_id是否在pojo中正確映射?

+0

任何想法如何訪問我的客戶端上的文檔ID? 我正在使用AngularJS客戶端並使用'$ http.get'來獲取所有文檔。 我收到的文件返回除_id'字段以外的所有字段。當然,我可以從與對象一起返回的'self'的'href'字段進行一些字符串提取。但是有更好的方法嗎? –

+0

到那時爲止,我剛剛在我的類中引入了另一個變量'employeeNumber',並將'this.employeeNumber = this._id'設置在'this._id = _id'行下面的setter'set_id()中。這樣我就可以得到'_id'作爲'employeeNumber'的僞裝返回。不是一個好方法,但找不到更好的方法。 –

0

最後,我通過將id_id重命名並在Person類中添加了相同的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; 
    } 
} 
相關問題