具有嵌套对象的Java post请求

xuo3flqw  于 2023-02-14  发布在  Java
关注(0)|答案(1)|浏览(172)

我有一个对象Order,它包含另一个对象Person以及其他属性。
我想知道什么是最好的解决方案,通过后创建一个订单的请求.
我想到的第一种方法是这样的:

@PostMapping("orders/create")
public void createOrder(@RequestBody Order order) {
    orderRepository.save(order);
}

但是我不喜欢这个解决方案的地方是客户端必须同时发送一个包含订单和人员所有信息的json字符串,如下所示:

{
    "date": 2023-01-01,
    "price": 10,
    "person": {
        "id": 1,
        "name": "Foo",
        ...
    }
}

我还如何确保请求中传递的人实际上是我的数据库中存在的人?
我能想到的第二种方法是这样的:

@PostMapping("orders/create/{personId}")
public void createOrder(@PathVariable Long personId, @RequestBody Order order) {
    Person person = personRepository.findById(personId).orElseThrow();
    order.setPerson(person);
    orderRepository.save(order);
}

但是这种解决方案需要像localhost:8080/orders/1这样的post请求,其中1是人的id,这很糟糕,因为它太混乱了。
我不能让我的头围绕这一点,任何见解是高度赞赏。

yzuktlbb

yzuktlbb1#

您说得对,将personId发送到订单API是没有意义的,因为您在RequestBody中传递personId,所以只需删除PathVariable并使用订单中的内容。

@PostMapping("orders/create")
public void createOrder(@RequestBody Order order) {
   Person person = personRepository.findById(order.getPerson().getId()).orElseThrow();
   order.setPerson(person);
   orderRepository.save(order);
}

或者,正如E-Riz的评论所回避的那样,如果Person是经过身份验证的用户,则将他们从SecurityContext中取出,并通过他们的用户名查找他们,这样就不需要在Order中发送Person。

相关问题