【发布时间】:2020-10-09 23:21:49
【问题描述】:
我正在开发 Spring HATEOAS REST api。 现在我遇到了隐藏Employee类的一些字段(我想隐藏其中一些)。
据我了解,必须使用 DTO(数据传输对象)。所以我创建了只包含我需要的这个字段的新类(EmployeeDTO)。我正在使用ModelMapper 映射适当的字段。
所以现在,我遇到了数据类型的问题。我是否必须将控制器中的所有返回值从 Employee 更改为 EmployeeDTO?然后更改 ModelAssembler 中的所有内容?
或者也许 DTO 类应该extends RepresentationModel? (这也迫使它在实体中扩展)。
期待您的帮助,所有这些看起来有点混乱(更改所有返回类型),我觉得应该有更聪明的解决方案。
我现在就是这样:
EmployeeController 中的方法:
@GetMapping(value = "/{id}", produces = "application/hal+json")
public EntityModel<Employee> getEmployeeById(@PathVariable Long id) {
Optional<Employee> employee = employeeService.findById(id);
return employeeModelAssembler.toModel(employee.get());
}
@GetMapping(value = "", produces = "application/hal+json")
public CollectionModel<EntityModel<Employee>> getAllEmployees() {
List<Employee> employeesList = EmployeeService.findall();
return employeeModelAssembler.toCollectionModel(EmployeesList);
}
EmployeeModelAssembler(在控制器中自动装配):
public class EmployeeModelAssembler implements RepresentationModelAssembler<Employee, EntityModel<Employee>> {
@Override
public EntityModel<Employee> toModel(Employee employee) {
EntityModel<Employee> employeeEntityModel = EntityModel.of(employee);
Link selfLink = linkTo(methodOn(EmployeeController.class).getEmployeeById(employee.getId())).withSelfRel();
employeeEntityModel.add(selfLink);
return employeeEntityModel;
}
@Override
public CollectionModel<EntityModel<Employee>> toCollectionModel(Iterable<? extends Employee> entities) {
List<Employee> employeesList = (List<Employee>) entities;
List<EntityModel<Employee>> employeeEML = employeesList.stream().map(this::toModel).collect(Collectors.toList());
Link selfLink = linkTo(methodOn(EmployeeController.class).getAllEmployees()).withSelfRel();
return CollectionModel.of(employeeEML, selfLink);
}
}
编辑
这是我在另一个控制器中访问这个 hal+json 响应的方式。目标是获取 EmployeeDTO 对象列表:
String uri = "http://localhost:8080/api/employees";
Traverson traverson = new Traverson(URI.create(uri), MediaTypes.HAL_JSON);
Traverson.TraversalBuilder tb = traverson.follow("href");
ParameterizedTypeReference<CollectionModel<EmployeeDTO>> typeReference = new ParameterizedTypeReference<CollectionModel<EmployeeDTO>>() {};
CollectionModel<EmployeeDTO> resEmployees = tb.toObject(typeReference);
Collection<EmployeeDTO> employees = resEmployees.getContent();
ArrayList<EmployeesDTO> employeesList = new ArrayList<>(employees);
for(EmployeesDTO x : employeesList) {
System.out.println(x);
System.out.println(x.getLinks());
}
【问题讨论】:
标签: spring spring-boot dto spring-rest spring-hateoas