我正在使用 spring-data-rest与 JpaRepository
创建休息端点。默认情况下,为所有 JpaRepository
启用分页,有什么好。但是我有一个遗留应用程序,我们将其移植到不支持分页的新堆栈中。我想根据 URL 参数禁用分页,以便仍然能够在新的应用程序代码中使用分页。
我尝试了各种方法来使用和不使用分页来公开资源:
CrudRepository
:导致只有一个未分页的端点和方法 flush
不见了。 List<T> findAll()
我的存储库界面中的方法并用 RestResource
注释它.我原以为该方法将作为搜索方法公开,但事实并非如此。 Page<T> findAll(Pageable pageable)
与 @RestResource(exported=false)
并注释 List<T> findAll()
就像之前的子弹一样。我希望这会取代默认方法。但这无论如何都不是有效的解决方案,因为只公开了一个非分页端点。 size=-1
获得无限结果 -> 使用默认分页大小 我见过 Spring Controller
RepositoryEntityController
使用 RepositoryInvoker
调用存储库上的方法。 Pageable
使用 PageableHandlerMethodArgumentResolver
解决它始终返回一个可分页(在查询中指定,带注释或默认可分页)。我目前看到的唯一解决方案是实现自定义
PageableHandlerMethodArgumentResolver
如果传递自定义 url 参数,则返回 null。您知道任何其他解决方案或将来有类似的计划吗?
最佳答案
我使用 PagingAndSortingRepository 和这个配置来设置我的 pageableResolver:
@Configuration
public class RestApiConfiguration extends RepositoryRestConfigurerAdapter {
@Bean
public HateoasPageableHandlerMethodArgumentResolver customResolver(
HateoasPageableHandlerMethodArgumentResolver pageableResolver) {
pageableResolver.setOneIndexedParameters(true);
pageableResolver.setFallbackPageable(new PageRequest(0, Integer.MAX_VALUE));
pageableResolver.setMaxPageSize(Integer.MAX_VALUE);
return pageableResolver;
}
}
见:https://jira.spring.io/browse/DATACMNS-929
这样,如果请求中包含页面和大小,您将获得请求的页面,但如果它们不在请求中,您将获得所有记录。在这两种情况下,如果指定了排序,则它用于对数据进行排序。
在第二种情况下,记录在页面内返回,但我可以接受。
编辑
https://jira.spring.io/browse/DATACMNS-929已修复,因此在新版本中,您可以使用
null
配置解析器。回退可分页。这样,当存在可分页数据(即 page
和 size
)时,您将检索一页,但如果不是,则检索所有记录:@Configuration
public class RestApiConfiguration extends RepositoryRestConfigurerAdapter {
@Bean
public HateoasPageableHandlerMethodArgumentResolver customResolver(
HateoasPageableHandlerMethodArgumentResolver pageableResolver) {
pageableResolver.setOneIndexedParameters(true);
pageableResolver.setFallbackPageable(null);
return pageableResolver;
}
}
关于paging - 如何在 spring-data-rest 中禁用 JpaRepository 的分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31379902/