我正在使用带有JpaRepository
的spring-data-rest来创建Rest-Endpoints。默认情况下,为所有JpaRepository
启用分页,这是一件好事。但我有一个遗留应用程序,我们移植到不支持分页的新堆栈。我想根据URL-Parameter禁用分页,以便仍能在新的应用程序代码中使用分页。
我尝试了各种方法来使用和不使用分页来公开资源:
CrudRepository
:结果仅包含未分页的端点且缺少方法flush
。List<T> findAll()
方法,并使用RestResource
对其进行注释。我原以为该方法将作为搜索方法公开,但事实并非如此。 Page<T> findAll(Pageable pageable)
注释@RestResource(exported=false)
并注释List<T> findAll()
,如之前的子弹中所示。我跳过这个替换默认方法。但无论如何这都不是有效的解决方案,因为只暴露了非分页端点。size=-1
获取无限结果 - &gt;使用默认分页大小我已经看到spring-controller RepositoryEntityController
使用RepositoryInvoker
来调用存储库中的方法。使用Pageable
解析PageableHandlerMethodArgumentResolver
,PageableHandlerMethodArgumentResolver
始终返回可分页(在查询中指定,注释或默认可分页)。
我目前看到的唯一解决方案是实现一个返回null的自定义<div>
,如果传递了自定义url参数。
您是否知道其他任何解决方案或未来的类似计划?
谢谢, 米莎
答案 0 :(得分:7)
我使用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
fallbackPageable配置解析程序。这样,当存在可分页数据(即page
和size
)时,您将检索一个页面,但是当它不是您检索所有记录时:
@Configuration
public class RestApiConfiguration extends RepositoryRestConfigurerAdapter {
@Bean
public HateoasPageableHandlerMethodArgumentResolver customResolver(
HateoasPageableHandlerMethodArgumentResolver pageableResolver) {
pageableResolver.setOneIndexedParameters(true);
pageableResolver.setFallbackPageable(null);
return pageableResolver;
}
}
答案 1 :(得分:2)
您可以将自己的方法添加到Repository界面,并返回类型为List<DomainObject>
或Collection<DomainObject>
且没有Pageable
参数。这将导致使用非分页响应。然后,您可以将旧客户端指向这些方法而不是默认方法。
或者,您可以将默认页面大小配置为非常大。在spring.data.rest.default-page-size
中设置application.properties
。
答案 2 :(得分:0)
这不是最干净的解决方案,但是以下代码允许您将self.engine = create_engine(conn_string, connect_args={'sslmode': 'require'})
作为查询参数进行传递,以便将所有结果都显示在一页中。
conn = psycopg2.connect(dbname='postgres', user='root', password=my_pass,
host=host_name, port='5432', sslmode='require')
答案 3 :(得分:0)
评分最高的答案表示setFallbackPageable
为空,该值不再有效。为PageRequest
使用默认的静态构造函数,如下所示:
@Configuration
public class RestApiConfiguration extends RepositoryRestConfigurerAdapter {
@Bean
public HateoasPageableHandlerMethodArgumentResolver customResolver(
HateoasPageableHandlerMethodArgumentResolver pageableResolver) {
pageableResolver.setOneIndexedParameters(true);
pageableResolver.setFallbackPageable(PageRequest.of(0, Integer.MAX_VALUE));
pageableResolver.setMaxPageSize(Integer.MAX_VALUE);
return pageableResolver;
}
}
答案 4 :(得分:0)
使用spring.data.rest和JpaRepoistoy来保持分页 添加一个配置类 Mural.class是我想限制访问的类
package com.chicagomural.mural.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer;
import org.springframework.http.HttpMethod;
import com.chicagomural.mural.entity.Mural;
@Configuration
public class MuralDataRestConfig implements RepositoryRestConfigurer {
@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
HttpMethod[] theUnsupportedActions = {HttpMethod.PUT, HttpMethod.POST, HttpMethod.DELETE, HttpMethod.PATCH};
config.getExposureConfiguration()
.forDomainType(Mural.class)
.withItemExposure((metdata, httpMethods) -> httpMethods.disable(theUnsupportedActions))
.withCollectionExposure((metdata, httpMethods) -> httpMethods.disable(theUnsupportedActions));
}
}