如何在spring-data-rest

时间:2015-07-13 09:36:01

标签: paging spring-data-rest

我正在使用带有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解析PageableHandlerMethodArgumentResolverPageableHandlerMethodArgumentResolver始终返回可分页(在查询中指定,注释或默认可分页)。 我目前看到的唯一解决方案是实现一个返回null的自定义<div>,如果传递了自定义url参数。

您是否知道其他任何解决方案或未来的类似计划?

谢谢, 米莎

5 个答案:

答案 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配置解析程序。这样,当存在可分页数据(即pagesize)时,您将检索一个页面,但是当它不是您检索所有记录时:

@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));
    }
}

https://docs.spring.io/spring-data/rest/docs/current/api/org/springframework/data/rest/core/config/RepositoryRestConfiguration.html