web-dev-qa-db-ja.com

0ではなく1ページから始まるSpringブートページネーションの設定方法

boot(1.4.0)ページネーション用の「ページング可能」。問題なく動作します。ただし、デフォルトではページ値は「0」から始まりますが、フロントエンドではページ値が「1」から始まります。コード内のページ番号を手動でインクリメントする代わりに、値をインクリメントする標準的なアプローチはありますか?

public Page<Device> find(DeviceFindCommand deviceFindCommand, Pageable pageable){
//page = 0 //Actual is 0, Expected increment by 1. 
}

どんな助けでもかなりのはずです。

次の問題を持つAlan回答を実装した後、

1)最初のページを返すゼロページにアクセスできます(これが問題であるかどうかはわかりませんが、より明確にしたいです)。

http:// localhost:8180/api/v1/books /?page = 3&size = 2

応答

{
    "content": [
{
  "id": "57da9eadbee83fb037a66029",
  .
  .
  .
}{
.
.
.
}
],
    "last": false,
    "totalElements": 5,
    "totalPages": 3,
    "size": 2,
    "number": 2, //strange always getting 1 less than page number.
    "sort": null,
    "first": true,
    "numberOfElements": 2
}

2) "number":2、応答では、常にページ番号より1つ小さくなります。現在のページインデックスを返す必要があります。

12
VelNaga

Spring Boot 2.Xを使用している場合は、WebMvcConfigurerAdapterからアプリケーションプロパティに切り替えることができます。ページング可能を構成する一連のプロパティがあります。

# DATA WEB (SpringDataWebProperties)
spring.data.web.pageable.default-page-size=20 # Default page size.
spring.data.web.pageable.max-page-size=2000 # Maximum page size to be accepted.
spring.data.web.pageable.one-indexed-parameters=false # Whether to expose and assume 1-based page number indexes.
spring.data.web.pageable.page-parameter=page # Page index parameter name.
spring.data.web.pageable.prefix= # General prefix to be prepended to the page number and page size parameters.
spring.data.web.pageable.qualifier-delimiter=_ # Delimiter to be used between the qualifier and the actual page number and size properties.
spring.data.web.pageable.size-parameter=size # Page size parameter name.
spring.data.web.sort.sort-parameter=sort # Sort parameter name.

ただし、one-indexed-parameterを変更した場合でも、ページレスポンス(PageImplクラス)はゼロベースのページ番号で結果を返すことに注意してください。少し誤解を招くかもしれません。

9
Przemek Nowak

Spring Bootはカバーの下でSpring Dataを使用します。

構成する必要があるSpring Dataクラスは次のとおりです。

org.springframework.data.web.PageableHandlerMethodArgumentResolver

特に次のメソッド:

http://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/web/PageableHandlerMethodArgumentResolver.html#setOneIndexedParameters-boolean-

これにより、現在のUIページングをそのまま使用できます。つまり、最初のページ= 1です。

ブートアプリケーションでは、構成は次のようになります。

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {


    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
        resolver.setOneIndexedParameters(true);
        argumentResolvers.add(resolver);
        super.addArgumentResolvers(argumentResolvers);
    }
}
7
Alan Hay

私はSpringブートとVue.jsで作業していますが、この問題がありました:)

たくさんのドキュメントがあるので、次のようにPageableを実装しました:

    @GetMapping("/all")
public Iterable<Document> getAll(@RequestParam(name = "page", required = false, defaultValue = "0") Integer page)
{
    this.connectToDatabase();

    if(page == null){
        page = 0;
    }

    if(page >= 1){
        // Front-end problem forces us to mad solutions
        page--;
    }

    Sort sort = new Sort(new Sort.Order(Sort.Direction.ASC, "id"));
    Pageable pageable = new PageRequest(page,15, sort);
    Iterable<Document> d = null;
    try{
        d = this.repository.findAll(pageable);
    }catch (Exception e){
        logger.error("Could not find documents in the database.", e);
    }

    return d;
}

初めてdocument/allを呼び出してページ0を取得します。その後、フロントエンドアプリからpage = page -1;を呼び出します。

したがって、フロントエンドからページ1を呼び出すと、バックエンドなどのページ0に移動します。

1
Grechka Vassili

より良い結果を得るには、以下のようにRepositoryRestMvcConfigurationを拡張する必要があります

@Configuration
   public class RespositoryConfiguration extends RepositoryRestMvcConfiguration {

    @Override
    @Bean
    public HateoasPageableHandlerMethodArgumentResolver pageableResolver() {

        HateoasPageableHandlerMethodArgumentResolver resolver = super.pageableResolver();
        resolver.setOneIndexedParameters(true);
        return resolver;
    }
}

次に、「番号」を除くすべてのリンクとページネーション情報を取得します。 page = 1の結果を確認し、

  "_links": {
    "first": {
      "href": "http://localhost:8080/user/user?page=1&size=5"
    },
    "self": {
      "href": "http://localhost:8080/user/user"
    },
    "next": {
      "href": "http://localhost:8080/user/user?page=2&size=5"
    },
    "last": {
      "href": "http://localhost:8080/user/user?page=2&size=5"
    }
  },
  "page": {
    "size": 5,
    "totalElements": 6,
    "totalPages": 2,
    "number": 0
  }
0
Shafiul