我必须编写一些REST服务,该服务应处理一百万个条目并以JSON格式返回给用户一个响应。我正在使用Spring编写一些REST控制器并进行分页。
public List<ContactDto> getAllContacts() {
double countItems = contactRepo.count();
int pages = (int) Math.ceil(countItems / totalItemsPerPage);
List<Contact> contacts = new ArrayList<>();
for (int i = 0; i < pages; i++) {
Page<Contact> page = contactRepo.findAll(PageRequest.of(i, totalItemsPerPage));
contacts.addAll(page.stream().collect(Collectors.toList()));
}
return contacts.stream()
.map(entity -> new ContactDto(entity.getId(), entity.getName()))
.collect(Collectors.toList());
}
我是春季和分页的新手。
这种方法有道理还是我做错了什么?
我的意思是我想知道我使用的是分页写还是错?
感谢您的帮助!
答案 0 :(得分:1)
似乎您正在从所有页面收集所有联系人,并且这没有意义,因为您将所有数据存储在内存中,从而抵消了所有延迟加载的好处。
我建议以下内容:
1.Rest控制器应该能够接受pageNumber和pageSize参数:
@GetMapping(value="/uri/{pageNumber}/{pageSize}")
public List<Contact> getContactsPage(@PathVariable("pageNumber") final Integer pageNumber, @PathVariable("pageSize") final Integer pageSize) {
//service or repository call
}
2.Repository接口应扩展PagingAndSortingRepository:
public interface ContactRepository extends PagingAndSortingRepository<Contact, Long> {
Page<Contact> fingAll(Pageable pageable);
}
3。在您的服务或控制器中直接创建一个Pageable对象,并将其作为ContactRepository#fingAll()参数传递:
final Pageable contactsPageable = PageRequest.of(pageNumber, pageSize);
4。如有必要,将页面映射到DTO。
答案 1 :(得分:0)
您应该看看Spring Data Rest。