如何在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
- Java中的SocketIO Client,如何实现与netty-socketio Server一起工作?
- 为什么PropertyDescriptor行为从Java 1.6变为1.7?
- 即使使用连接validation,Tomcat JDBC Conencton Pool + MySQL也会出现“Broken pipe”问题
- Struts 2 – 重用自定义表达式validation器
- 依赖于默认编码,我应该使用什么以及为什么?
- Java将图像转换为输入流而不创建文件
- 更改JAX-WS服务URL
- Lucene中的索引和搜索日期
- 没有String-argument构造函数/工厂方法从String值(”)反序列化