显示针对我的 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 作为唯一参数。