【发布时间】:2015-08-19 02:32:57
【问题描述】:
我正在使用 Spring Data JPA。
我的控制器如下所示
@RequestMapping(value = "/pages/{pageNumber}", method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Page<User>> paginatedUser(@PathVariable final Integer pageNumber)
{
final PageRequest request = new PageRequest(pageNumber - 1, DEFAULt_PAGE_SIZE, Sort.Direction.DESC, "startTime");
return new ResponseEntity<>(userRepository.findAll(request), HttpStatus.OK);
}
现在我决定发送 PageDTO 对象而不是 Page 对象来限制发送内容。有什么方法可以使用 java 8 将 Page 转换为 PageDTO。
我看到 Page 是从 Iterable 派生的,所以我想我可以执行以下操作,但不确定如何将其与 PageDTO 和 UserDTO 放在一起。
StreamSupport.stream(userRepository.findAll(request).spliterator(),false)
是否有任何有效的 java 8 方法可以做到这一点。
我想出了这个解决方案
@RequestMapping(value = "/pages/{pageNumber}", method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<PageDTO> paginatedUser(@PathVariable final Integer pageNumber)
{
final PageRequest request = new PageRequest(pageNumber - 1, DEFAULt_PAGE_SIZE, Sort.Direction.DESC, "startTime");
final Page<User> page = userRepository.findAll(request);
return new ResponseEntity<>(new PageDTO(page, StreamSupport.stream(page.getContent().spliterator(), true).map(UserDTO::new)
.collect(Collectors.toList())), HttpStatus.OK);
}
public class PageDTO {
private int beginIndex;
private int currentIndex;
private int endIndex;
private List<?> entities;
public PageDTO(final Page<?> page, final List<?> entities) {
this.entities = entities;
this.currentIndex = page.getNumber() + 1;
this.beginIndex = Math.max(1, currentIndex - 5);
this.endIndex = Math.min(beginIndex + 10, page.getTotalPages());
}
想知道是否有其他有效的方法来做到这一点?
【问题讨论】:
标签: java lambda java-8 spring-data spring-data-jpa