Отправка POST-запроса с помощью Postman с @DBref

Я хочу отправить запрос POST с Postman, который создает объект Purchase и сохраняет его в базе данных.

Мой класс Покупка:

@Document(collection = "purchases")
public class Purchase {

    @Id
    private String id;
    @DBRef
    private User buyer;
    @DBRef
    private List<File> FilesToPurchase;
    private Long timestamp;

    public Purchase() { }

    public Purchase(User buyer, List<File> filesToPurchase) {
        this.buyer = buyer;
        FilesToPurchase = filesToPurchase;
    }

// Getters and setters not posted here.

Я хочу вставить в базу данных новую покупку, сделанную уже существующим пользователем «покупатель», который хочет приобрести список уже существующих файлов «FilesToPurchase».

У меня в контроллере есть функция POST, которая получает объект Purchase с использованием аннотации @RequestBody, но пока у меня есть NullPointerExceptions из-за полученного пустого объекта Purchase.

Я не знаю, как обращаться с аннотацией @DBRef. В Postman я пытаюсь отправить JSON следующим образом:

{
    "buyer": {
        "$ref":"users",
       "$id" : "ObjectId('5bb5d6634e5a7b2bea75d4a2')"
    },
    "FilesToPurchase": [
     { "$ref":"files",
       "$id" : "ObjectId('5bb5d6634e5a7b2bea75d4a5')"
     }
  ] 
} 

person Ana    schedule 04.10.2018    source источник
comment
переименуйте поле FilesToPurchase и установите значение filesToPurchase, чтобы оно соответствовало соглашениям Java, и попробуйте это {покупатель: {id: 5bb5d6634e5a7b2bea75d4a2}, filesToPurchase: [{id: 5bb5d6634e5a7b2bea75d4a5}]}   -  person Vlad Mamaev    schedule 04.10.2018
comment
@VladMamaev спасибо за ответ. Я изменил имя и сделал как вы мне сказали, и в моей функции поста объект Покупка был создан, но покупатель и файлыToPurchase внутри пусты, кроме поля id. Такое поведение нормально? Это потому, что он просто хранит ссылку?   -  person Ana    schedule 04.10.2018


Ответы (1)


Переименуйте поле «FilesToPurchase» и установите значение «filesToPurchase», чтобы оно соответствовало соглашениям Java, и попробуйте это.

{ "buyer": { "id" : "5bb5d6634e5a7b2bea75d4a2" }, "filesToPurchase": [ { "id" : "5bb5d6634e5a7b2bea75d4a5" } ] }

Отмечая параметр контроллера с помощью @RequestBody, вы просите Spring десериализовать ввод json в объект java (по умолчанию используется Jackson ObjectMapper). Он не будет автоматически заполнять все поле @Dbref, вы должны сделать это самостоятельно, запросив монго, если хотите, однако единственное поле, которое вам нужно в указанном объекте для сохранения объекта, который ссылается на него, это «id».

person Vlad Mamaev    schedule 04.10.2018