spring-boot - 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 practise
REST api 中的这种情况是什么?我应该保持原样吗?只公开 id (我问你怎么做);还是使用 DTO 而根本不显示它?
此外,无论如何我都会将 _links 添加到该用户的部门,在这种情况下,我认为只留下 id 应该没问题(如果我错了,请告诉我)。期待您的回答!
解决方案
一个好的做法是定义一个 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
推荐阅读
- excel - excel下拉菜单中的VBA多个值删除错误选择的项目
- php - PHP:检查数组值是否存在于另一个数组中
- javascript - Web Crypto API:如何导入 RSA 私钥
- azure - 读取存储为 .h5 的 blob 并在 Python 中的 Azure Functions 中加载 keras 模型
- angular - 为什么工厂解析器只能工作一次?
- asp.net-core - 剃刀页面表单后期处理
- laravel - Laravel:删除经过身份验证的用户的请求限制
- mongodb - 如果文档中不存在数据则插入 – 如何使用 Mongoose 插入新字段和数据?
- c++ - C ++ alsa api不良记录质量
- c# - 如何在 C# 中检查数组中的值?