java - 如何在 web 服务响应中将 json 响应作为块返回?
问题描述
我有一个简单的rest webservice 端点,它将查询Spring
的结果公开为:myqsl
json
@RestController
public class DbController {
@GetMapping(produces = APPLICATION_JSON_VALUE)
public List<Map<String, Object>> query() {
return crudRepository.queryForList(sql);
}
}
问题:对于返回 500k 个对象(意味着:行)的大型查询,这会消耗大量内存。
有什么办法可以将“部分”json
结果写入响应流?
解决方案
您可以使用Pagination
每个请求为客户端创建一大块数据。
你可以这样做:
存储库:
@Repository
public interface SomethingRepository extends PagingAndSortingRepository<Something, Long> {
Page<Something> findByMember_Id(Long memberId, Pageable pageable);
}
SomePageDto:
public class SomethingPageDto{
@JsonProperty("favourite_list")
private List<SomethingDto> somethings= new ArrayList<>();
@JsonProperty("total_pages")
private int totalPages;
@JsonProperty("current_page")
private int currentPage;
@JsonProperty("total_elements")
private Long totalElements;
@JsonProperty("current_page_elements")
private int currentPageElement;
}
服务:
@Autowired
private SomethingRepository repository;
public SomethingPageDTO getSomething(int pageNo, int pageSize, Long memberId) throws Exception {
Pageable paging = new PageRequest(pageNo, pageSize);
Page<Something> somethingPage = repository.findByMember_Id(memberId, paging);
//map EntityList to DTO
List<SomethingPageDTO > somethingDtos = new ArrayList<>();
return somethingDtos = somethingPage.getContent();
//somethingPage.getTotalElements();
//somethingPage.getTotalPages();
}
控制器:
@RestController
@RequestMapping("/some")
public class EmployeeController
{
@Autowired
somethingService service;
@GetMapping
public ResponseEntity<List<Something>> getAll(
@RequestParam Integer pageNo,
@RequestParam Integer pageSize,
@RequestParam Long memberId
{
List<somethingDto> list = service.getSomething(pageNo, pageSize, memberId);
return new ResponseEntity<List<SomethingDto>>(list, new HttpHeaders(), HttpStatus.OK);
}
}
更多资源:
https://dzone.com/articles/pagination-in-springboot-applications
https://howtodoinjava.com/spring-boot2/pagination-sorting-example/
推荐阅读
- c# - .NET Core API 输入 XML 反序列化为没有包装类的模型
- python - 如何在 python-turtle 中设置水平和垂直边框
- oracle - 使用分隔值拆分记录
- python - 查找文件时,我在 haarcascade_frontalface_default.xml 中打开 cv 时出错
- flutter - Riverpod 条件提供程序状态更新
- android - 从 ViewModel 向 ViewPager2 的 Adapter 发送实时数据
- javascript - 未处理的拒绝(TypeError):observer.complete.bind 不是函数
- anylogic - AnyLogic 中的意外行为 SelectOutput 块
- javascript - 将“未定义”转换为未定义 - JavaScript
- c++ - CLion 不会使用地址清理程序运行二进制文件