Если вы хотите отделить ресурс, предоставляемый вашим API, от объекта JPA, что является хорошей идеей, вам придется обновить свой контроллер для обработки соответствующих типов.
См. Пример ниже:
Во-первых, предположим, что у вас есть следующий DTO:
public class EmployeeDTO extends RepresentationModel<EmployeeDTO> {
private long id;
private String surname;
private String departmentId;
// getters and setters
}
Обратите внимание, что я не смешиваю вашу сущность JPA (Сотрудник) с DTO.
Теперь ваш контроллер должен быть обновлен, чтобы вернуть соответствующий тип.
@GetMapping(value = "/{id}", produces = "application/hal+json")
public EmployeeDTO getEmployeeById(@PathVariable long id) {
Optional<Employee> employee = employeeService.findById(id);
return employeeModelAssembler.toModel(employee.get());
}
@GetMapping(value = "", produces = "application/hal+json")
public CollectionModel<EmployeeDTO> getAllEmployees() {
List<Employee> employeesList = employeeService.findAll();
return employeeModelAssembler.toCollectionModel(employeesList);
}
И пример ModelAssembler
@Component
public class EmployeeModelAssembler implements RepresentationModelAssembler<Employee, EmployeeDTO> {
@Override
public EmployeeDTO toModel(Employee employee) {
ModelMapper modelMapper = new ModelMapper();
EmployeeDTO employeeDto = modelMapper.map(employee, EmployeeDTO.class);
Link selfLink = linkTo(methodOn(EmployeeController.class).getEmployeeById(employee.getId())).withSelfRel();
employeeDto.add(selfLink);
return employeeDto;
}
@Override
public CollectionModel<EmployeeDTO> toCollectionModel(Iterable<? extends Employee> employeesList) {
ModelMapper modelMapper = new ModelMapper();
List<EmployeeDTO> employeeDTOS = new ArrayList<>();
for (Employee employee : employeesList){
EmployeeDTO employeeDto = modelMapper.map(employee, EmployeeDTO.class);
employeeDto.add(linkTo(methodOn(EmployeeController.class)
.getEmployeeById(employeeDto.getId())).withSelfRel());
employeeDTOS.add(employeeDto);
}
return new CollectionModel<>(employeeDTOS);
}
}
Я протестировал его и получил следующий ответ , предполагая, что у меня есть конечная точка сотрудников
получить сотрудников / 1
{
"id": 1,
"surname": "teste",
"departmentId": "1",
"_links": {
"self": {
"href": "http://localhost:8080/employees/1"
}
}
}
получить сотрудников
{
"_embedded": {
"employeeDtoList": [
{
"id": 1,
"surname": "teste",
"departmentId": "1",
"_links": {
"self": {
"href": "http://localhost:8080/employees/1"
}
}
},
{
"id": 2,
"surname": "teste",
"departmentId": "2",
"_links": {
"self": {
"href": "http://localhost:8080/employees/2"
}
}
}
]
}
}