当前位置: 首页 > 知识库问答 >
问题:

为SpringBoot设计REST API的正确方法是什么

窦成荫
2023-03-14

正如我对SpringBoot中REST API的设计所知,我们将为用户设计API

对于get/update/delete=/v1/users/{userId}/addressId/{addressId}(从具有给定用户ID的用户的地址中获取/update/delete地址)

因此,我创建了类似的API,但是对于Add/Get/Update/Delete,我可以通过RestController->Services->Repository->DB将地址定向到地址表中

现在,对于地址CRUD,我从来没有使用{userId},这是在API中提供的

@Override
public Address addAddress(Address address) {

    address = addressRepository.save(address);
    return address;
}

是我在代码中做错了什么,还是我对rest的概念没有明确。

提前谢谢你。

共有1个答案

云隐水
2023-03-14
  1. 我认为首先你应该想出用户和地址之间的关系结构。
  2. 类地址不能没有用户,用户可以有多个地址,也可以只有一个地址,这基本上是关系的基数。请参阅接受的ANWER。
  3. 一旦完成,您就会想到CASCADE类型,并使用HELPER方法将父级和子级持久化。这里是一个很好的例子。将尝试为您的示例上传代码。让我知道这一点:)

编辑:

@Entity
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;

    private String userName;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user", orphanRemoval = true)
    private List<Address> addresses = new ArrayList<>();

    public void addAddress(Address address) {
        addresses.add(address);
        address.setUser(this);
    }

    public void removeAddress(Address address) {
        address.setUser(null);
        this.addresses.remove(address);
    }

}
@Entity
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Address {
    private Long id;

    private String address;

    @ManyToOne
    private User user;
}
public class Service 
{
   @PostMapping(value="/saveAddressForUser")
   public void saveAddressForUser(@RequestBody AddressForUser address)
   {
       User user=getUserFromDatabase(userId);
       user.addAddress(address);
       Repository.persist(user);//it will also persist address as cascade type is all.
   }
}
 类似资料:
  • 问题内容: 我在Django 1.6上无法正常使用翻译存在问题。我已将此添加到我的settings.py中: 还添加了中间件: 以及每当我使用应为l10nd的字符串时的* .py文件: 我的模板开始于: 在模板内部,我使用了trans占位符。例如 我在locale / de / LC_MESSAGES / django.po中提供了翻译: 问题答案: 添加到并将其设置如下: 请注意,它必须是一个元

  • 问题内容: 这个问题应该比关于更多。 我有一个子类(在python 2.7中,numpy 1.6.2),并且我发现在对象时未列出的字段名称(因此,ipython的自动完成功能无效)。 为了修复它,我尝试在子类中重写,如下所示: 结果是:。(我发现这里实际上应该在python 3.3中工作…) 作为一种解决方法,我尝试了: 据我所知,这是可行的,但当然并不优雅。 问题: 后一种解决方案对我而言是否正

  • 问题内容: 我的代码如下: 如果在获取之前设置标题,可以吗?我的标头会被发送,还是服务器会看到默认的用户代理(如果有)? 问题答案: 必须 先设置标头,然后才能产生任何影响- 如果连接已经打开,则将引发。 就头而言,如果已设置,则应将其发送。 请参阅URLConnection JavaDoc。

  • 问题内容: 即使在使用Java Swing一年以上之后,对我来说,它仍然像魔术一样。如何正确使用BufferStrategy,尤其是方法? 我想添加一个JFrame和一个Canvas,然后进行绘制。我还希望能够调整()画布的大小。每次我调整Canvas的大小时,似乎都会被浪费掉,或者变得毫无用处,因为在上使用并没有真正做任何事情。另外,它具有怪异的不确定性行为,我不知道如何正确同步它。 这就是我的

  • 问题内容: 我想在Linux上使用该机制。我希望我的应用程序知道何时更改了文件。能否请您提供给我一个示例,该怎么做? 问题答案: 文档(来自具有inotify的Monitor文件系统活动) 在C API 提供了三个系统调用来构建各种文件系统监视器: 在内核中创建子系统的实例,并在成功和失败时返回文件描述符。与其他系统调用一样,如果失败,请检查诊断。 顾名思义,它增加了一块 手表 。每个监视都必须提

  • 问题内容: 需要帮助,以了解如何在UIKit中使用prepareForReuse()。该文件说 您只应重置与内容无关的单元格属性,例如Alpha,编辑和选择状态 但是如何重置单个属性属性(例如isHidden)呢? 假设我的单元格有2个标签,我应该在哪里重置: 标签文本 label.numberOfLines label.isHidden 我的tableView(_:cellForRowAt :)