quarkus分页查询空表抛RestDataPanacheException如何返回空列表?
问题结论
你遇到的是quarkus-spring-data-rest包的已知历史bug,根因是空表场景下,框架内部计算分页偏移量时逻辑错误,错误得到下标为-1的分页参数,传入quarkus-rest-data-panache的分页接口后触发参数合法性校验失败。
解决方案
- 方案1:升级Quarkus版本
该bug已在Quarkus 2.16.0及之后的稳定版本中修复,直接将项目的Quarkus版本升级至2.16.10.Final、3.2.x LTS或更高的稳定版即可解决问题。 - 方案2:临时异常拦截适配(不升级版本场景)
新增全局异常处理器捕获RestDataPanacheException,判断异常根因为页下标非法时,直接返回符合预期的空分页结果,示例代码如下:@Provider public class PanachePageExceptionMapper implements ExceptionMapper<RestDataPanacheException> { @Override public Response toResponse(RestDataPanacheException e) { if (e.getCause() instanceof IllegalArgumentException && e.getCause().getMessage().contains("Page index must be >= 0")) { // 构造空分页返回体,可根据自己接口的返回格式调整 return Response.ok(Page.empty()).build(); } return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } } - 方案3:重写对应Repository的列表查询方法
手动接管分页参数校验,当下标小于0时强制设置为0再执行查询:@RepositoryRestResource public interface MyEntityRepository extends PanacheRepository<MyEntity> { @Override default Page<MyEntity> findAll(Pageable pageable) { int pageIndex = Math.max(pageable.getPageNumber(), 0); return PanacheRepository.super.findAll(Page.of(pageIndex, pageable.getPageSize())); } }
内容的提问来源于stack exchange,提问作者Ethan Miller
相关产品推荐
相关产品推荐

