首页 > 解决方案 > Spring REST api - 外键ID而不是整个对象

问题描述

我的 REST api GET 方法返回的 Json 有问题。

这就是我的实体的样子:

@Entity
public class Employee {
    ...
    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "department_id", nullable = true)
    private Department department;
}

@Entity
public class Department {
    ...
    @OneToMany(mappedBy = "department", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JsonBackReference
    private Set<Employee> employees;
}

这就是我得到的答案,而我正在尝试通过其 id 获取员工:

{
    "id": 1,
    "surname": "smith",
    "department": {
      "id": 1,
      "name": "HR",
      "room": "13"
    }
}

现在,而不是整个 Department 对象,我只想得到简单的 id: "department_id": 1但我不知道该怎么做。

第二个问题:good practiseREST api 中的这种情况是什么?我应该保持原样吗?只公开 id (我问你怎么做);还是使用 DTO 而根本不显示它? 此外,无论如何我都会将 _links 添加到该用户的部门,在这种情况下,我认为只留下 id 应该没问题(如果我错了,请告诉我)。期待您的回答!

标签: spring-bootrestspring-rest

解决方案


一个好的做法是定义一个 DTO 来表示 API 公开的数据。这应该与您的域(员工)分离,因为它将为您提供更大的灵活性,就像您想要实现的那样。

class EmployeeDTO extends RepresentationModel {
    private long id;
    private String surname;
    private long departmentId;

   // getters and setters
}

这应该有效。当然,您需要将您的 Employee 实体映射到 EmployeeDTO。RepresentationModel 包含 HATEOAS 所需的 _links 属性(例如,查看 https://www.baeldung.com/spring-hateoas-tutorial

关于从数据库中公开 id,我认为不这样做的一个很好的理由是您免费提供有关数据库大小的信息,而这可能是您不想要的。甚至可以从中获得更多信息。

在这里您可以找到关于该主题的精彩讨论: 公开数据库 ID - 安全风险?

我建议看一下 UUID,它是一个通用唯一的字母数字标识符,不会公开有关您的数据的这些信息。更多关于 UUID:https ://www.baeldung.com/java-uuid


推荐阅读