2016-08-23 7 views
0

Я следую этой весной руководство: https://spring.io/guides/gs/accessing-mongodb-data-rest/Как отправить POST документ с ручным идентификатором в базе данных MongoDB из Spring RESTful Spring на базе гипермедиа?

Все отлично, но если я хочу, чтобы отправить документ с ручным ид, я не в состоянии сделать это.

Вот что все, что я сделал:

Я вставил один документ из Монго оболочки с помощью команды db.person.insert({"_id": "111111", "firstName" : "Vikas", "lastName" : "Prasad"});

Это прекрасно работает, и если я делаю GET в http://localhost:8080/people от Postman, я могу видеть человека документ с идентификатором 111111 в ответ, имеющего себе HREF, как http://localhost:8080/people/111111

Но если я направляю POST запрос от Почтальон в http://localhost:8080/people с телом, как {"_id": "222222", "firstName" : "Aadish", "lastName" : "Patodi"}, й В документ вставлен автоматический идентификатор вместо 222222. Из-за чего я, очевидно, не могу получить доступ к этому документу, выполнив GET по адресу http://localhost:8080/people/222222, в отличие от случая, когда я использовал insert() из оболочки, чтобы вставить документ с ручным идентификатором. Вместо этого я должен нажать GET на http://localhost:8080/people/57bc29ada3fab115cc9b546b, чтобы получить этот второй документ.

Просто проверьте, есть ли я снова с номером {"_id": "222222", "firstName" : "Aadish", "lastName" : "Patodi"}, его получение снова вставлено при новом автогенерированном идентификаторе: http://localhost:8080/people/57bc2bdaa3fab115cc9b546c. Это означает, что MongoDB даже не смотрит на _id, иначе он должен был выбросить duplicate key error.

Я пробовал искать различные источники. Все, что я могу найти, это реализация кода доступа к данным отдельно в JAVA на задней панели и вызов соответствующих методов MongoDB.

Мой вопрос:

Так же, как в данном учебнике они выполняют все операции без определения какого-либо JAVA обратно конечного кода для доступа к данным из MongoDB для автоматической идентификации документов, есть способ сделать то же самое для руководства идентификационные документы? Или просто для этого одного варианта использования я должен реализовать код доступа к данным на заднем конце?

Я использую CorsFilter для обработки запросов перекрестного происхождения.

Edit:

Ниже 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; 
    } 
} 

Я пробовал:

-> добавление геттер и сеттер для id атрибута

-> переименование id до employeeNumber

-> переименование id к employeeNumber и добавление получения и установки для employeeNumber

Ни одно из этих трех решить эту проблему.

+0

Можете ли вы вставить свой код? где вы сохраняете коллекцию в db и ту, где вы объявили человека pojo, чтобы сопоставить поле id весной до mongodb? – user641887

+0

похоже, что ваше поле _id неверно отображено. – user641887

+0

Нет явной экономии коллекции для db, как видно из руководства. Коллекция создается на первом «POST» из Postman или из первого 'insert()' из оболочки, в зависимости от того, что произойдет раньше. Человек pojo такой же, как в руководстве. Но я добавил редактирование. Пожалуйста, смотрите. –

ответ

0

как обсуждалось в комментарии, похоже, что ваше поле _id не отображается правильно. Можете ли вы проверить правильность отображения _id в pojo?

+0

Любая идея, как я могу получить доступ к идентификатору документа на моем клиенте? Я использую клиент AngularJS и используя '$ http.get' для извлечения всех документов. Я получаю документы, возвращающие все поля со своими значениями, кроме поля '_id'. Конечно, я могу сделать некоторое извлечения строки из поля 'href'' self', возвращенного вместе с объектом. Но есть ли лучший способ? –

+0

до тех пор, я только что представил другую переменную в моем классе как 'employeeNumber' и установил' this.employeeNumber = this._id' в setter 'set_id()' под строкой 'this._id = _id'. Таким образом, я могу получить '_id', возвращенный в маскировку' employeeNumber'. Не отличный подход, но не мог найти лучшего способа. –

0

Наконец, я получил его, переименовав id с _id и добавив геттер и сеттер для этого же в классе Person.

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