如何在Spring-data-rest中将Page 映射到Page

当我使用PagingAndSortingRepository.findAll(Pageable)访问数据库时,我得到Page 。 但是,我想将DTO暴露给客户端而不是实体。 我可以通过将实体注入到它的构造函数中来创建DTO,但是如何将Page对象中的实体映射到DTO? 根据spring文档,Page提供了只读操作。

另外,Page.map不可能,因为我们不支持java 8.如何手动创建带有映射对象的新页面?

您仍然可以使用没有lambda表达式的Page.map

 Page entities = objectEntityRepository.findAll(pageable); Page dtoPage = entities.map(new Converter() { @Override public ObjectDto convert(ObjectEntity entity) { ObjectDto dto = new ObjectDto(); // Conversion logic return dto; } }); 

这是我的解决方案,感谢@Ali Dehghani

 private Page mapEntityPageIntoDTOPage(Page objectEntityPage) { return objectEntityPage.map(new Converter() { public ObjectDTO convert(ObjectEntity objectEntity) { return new ObjectDTO(objectEntity, httpSession); } }); } 

在Spring Data 2中,Page map方法采用Function而不是Converter,但它仍然与@Ali Dehghani描述的基本相同。

使用function:

 Page entities = objectEntityRepository.findAll(pageable); Page dtoPage = entities.map(new Function() { @Override public ObjectDto apply(ObjectEntity entity) { ObjectDto dto = new ObjectDto(); // Conversion logic return dto; } }); 

在java8中:

 Page entities = objectEntityRepository.findAll(pageable) .map(ObjectDto::fromEntity); 

其中fromEntity是ObjectDto上包含转换逻辑的静态方法。

最后,您不会将页面返回给用户,而是返回ObjectDTO列表,页面上的页面详细信息,这将是我的解决方案。

ObjectService

 public Page findAll (Pageable pageable){ //logic goes here. Page page = objectRepository.findAll(pageable); return page; } 

ObjectResource / rest(暴露的端点)

 @GetMapping public ResponseEntity> findAll (Pageable pageable){ Page page = objectServiceService.findAll(pageable); HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "your-endpoint-here"); return new ResponseEntity<>(objectMapper.toDto(page.getContent()), headers, HttpStatus.OK); } 

使用它的原因是您不需要复制ObjectEntity和DTO的页面详细信息。 值得注意的是,页面包含以下内容:

  • 页码
  • 页面大小
  • numberOfElements
  • 内容

内容是返回的对象列表,并且是唯一需要映射到DTO的内容。

您只需执行以下操作即可使用Page.map:

 public Page toPageObjectDto(Page objects) { Page dtos = objects.map(this::convertToObjectDto); return dtos; } private ObjectDto convertToObjectDto(Object o) { ObjectDto dto = new ObjectDto(); //conversion here return dto; }