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つ小さくなります。現在のページインデックスを返す必要があります。
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
クラス)はゼロベースのページ番号で結果を返すことに注意してください。少し誤解を招くかもしれません。
Spring Bootはカバーの下でSpring Dataを使用します。
構成する必要があるSpring Dataクラスは次のとおりです。
org.springframework.data.web.PageableHandlerMethodArgumentResolver
特に次のメソッド:
これにより、現在の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);
}
}
私は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に移動します。
より良い結果を得るには、以下のように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
}