显示针对我的 GET 端点的特定 JSON 响应
Showing a specific JSON response for my GET endpoint
我在 Department 和 Employee 之间有一个多对多的关系
我已经为 GET 端点完成了映射,其中 returns 包含员工的部门列表,这是请求:http://localhost:8080/api/departments/1/employees
,这是我得到的响应:
[
{
"id": {
"deptNo": "1 ",
"empNo": 2
},
"fromDate": "2021-11-22",
"toDate": null
}
]
这是完成工作的代码:
部门库 Imp
@Override
public Optional<Department> findByIdWithEmployees(String deptNo) {
TypedQuery<Department> query = this.entityManager.createQuery("SELECT d FROM Department d JOIN FETCH d.employees e WHERE d.deptNo = :deptNo AND e.toDate IS NULL", Department.class).setParameter("deptNo", deptNo);
return Optional.ofNullable(query.getSingleResult());
}
员工服务实施
@Override
public List<DepartmentEmployee> listAllEmployeesPerDepartment(String deptNo) {
Department department = this.departmentRepository.findByIdWithEmployees(deptNo).orElseThrow(() -> new DepartmentNotFoundException(deptNo));
return department.getEmployees();
}
部门总监
@GetMapping("/{deptNo}/employees")
public List<DepartmentEmployee> getEmployeesPerDepartment(@PathVariable String deptNo) {
return this.employeeService.listAllEmployeesPerDepartment(deptNo);
}
现在我需要重新映射它以便得到不同的响应。这是我 运行 GET 请求时需要收到的响应:
[
{
"fromDate":"2021-11-22",
"toDate":null,
"employee":{
"empNo":2,
"birthDate":"1997-05-10",
"firstName":"Taulant",
"lastName":"Fazliu",
"gender":"M",
"hireDate":"2020-01-01"
}
}
]
如何实现?
如果您要给出的响应与您的模型(您显示的第一个图表)具有不同的结构,则需要实施 DTO 模式。
DTO: D数据T传输O 对象。用 Samuel L. Jackson 的话来说,这只是意味着“嘿你!你想以不同的方式展示你的狗屎吗?创建一个代表新狗屎的新混蛋对象,然后他妈的改造它!"
因此,使用您要显示的结构创建一个名为 DepartmentEmployeeDTO
的新对象,并使用 Builder
模式从一个对象转换为另一个对象。当然还有 getEmployeesPerDepartment
return List<DepartmentEmployeeDTO>
。该方法最终会像这样:
@GetMapping("/{deptNo}/employees")
public List<DepartmentEmployeeDTO> getEmployeesPerDepartment(@PathVariable String deptNo) {
return this.employeeService.listAllEmployeesPerDepartment(deptNo)
.stream()
.map(e -> new DepartmentEmployeeDTOBuilder(e).build())
.collect(Collectors.toList());
}
如果你用一个构造函数构建你 Builder
,原始 DepartmentEmployee
作为唯一参数。
我在 Department 和 Employee 之间有一个多对多的关系
我已经为 GET 端点完成了映射,其中 returns 包含员工的部门列表,这是请求:http://localhost:8080/api/departments/1/employees
,这是我得到的响应:
[
{
"id": {
"deptNo": "1 ",
"empNo": 2
},
"fromDate": "2021-11-22",
"toDate": null
}
]
这是完成工作的代码:
部门库 Imp
@Override
public Optional<Department> findByIdWithEmployees(String deptNo) {
TypedQuery<Department> query = this.entityManager.createQuery("SELECT d FROM Department d JOIN FETCH d.employees e WHERE d.deptNo = :deptNo AND e.toDate IS NULL", Department.class).setParameter("deptNo", deptNo);
return Optional.ofNullable(query.getSingleResult());
}
员工服务实施
@Override
public List<DepartmentEmployee> listAllEmployeesPerDepartment(String deptNo) {
Department department = this.departmentRepository.findByIdWithEmployees(deptNo).orElseThrow(() -> new DepartmentNotFoundException(deptNo));
return department.getEmployees();
}
部门总监
@GetMapping("/{deptNo}/employees")
public List<DepartmentEmployee> getEmployeesPerDepartment(@PathVariable String deptNo) {
return this.employeeService.listAllEmployeesPerDepartment(deptNo);
}
现在我需要重新映射它以便得到不同的响应。这是我 运行 GET 请求时需要收到的响应:
[
{
"fromDate":"2021-11-22",
"toDate":null,
"employee":{
"empNo":2,
"birthDate":"1997-05-10",
"firstName":"Taulant",
"lastName":"Fazliu",
"gender":"M",
"hireDate":"2020-01-01"
}
}
]
如何实现?
如果您要给出的响应与您的模型(您显示的第一个图表)具有不同的结构,则需要实施 DTO 模式。
DTO: D数据T传输O 对象。用 Samuel L. Jackson 的话来说,这只是意味着“嘿你!你想以不同的方式展示你的狗屎吗?创建一个代表新狗屎的新混蛋对象,然后他妈的改造它!"
因此,使用您要显示的结构创建一个名为 DepartmentEmployeeDTO
的新对象,并使用 Builder
模式从一个对象转换为另一个对象。当然还有 getEmployeesPerDepartment
return List<DepartmentEmployeeDTO>
。该方法最终会像这样:
@GetMapping("/{deptNo}/employees")
public List<DepartmentEmployeeDTO> getEmployeesPerDepartment(@PathVariable String deptNo) {
return this.employeeService.listAllEmployeesPerDepartment(deptNo)
.stream()
.map(e -> new DepartmentEmployeeDTOBuilder(e).build())
.collect(Collectors.toList());
}
如果你用一个构造函数构建你 Builder
,原始 DepartmentEmployee
作为唯一参数。