2016-10-05 33 views
6

boot (1.4.0) "Pageable" dla stronicowania. Działa bez problemów. Domyślnie wartość strony zaczyna się od "0", ale z przodu -wartość strony zaczyna się od "1". Czy istnieje jakieś standardowe podejście do wartości przyrostu zamiast ręcznego zwiększania numeru strony w kodzie?Jak skonfigurować stronicowanie w Spring Side począwszy od strony 1, a nie 0

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

Każda pomoc powinna być znacząca.

Po wdrożeniu Alan odpowiedzi o następujących zagadnień,

1) Nadal jestem w stanie uzyskać dostęp do strony, która zwraca zerowy pierwszą stronę (nie wiem czy to jest problem, ale nie chcę, aby uzyskać lepsza klarowność).

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

Response

{ 
    "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) "numer": 2, w odpowiedzi zawsze uzyskanie jednego mniej niż number.It strona powinna powrócić bieżący indeks stron.

+0

Jakiej technologii używasz do tworzenia stron frontowych? –

+0

Wiosenny rozruch 1.4.0 – VelNaga

+0

@ Cèsar Przedni koniec z użyciem Ember 2.7 s – VelNaga

Odpowiedz

2

Spring Boot będzie używał danych sprężyn pod osłonami.

klasa

The Spring danych należy skonfigurować jest następujący:

org.springframework.data.web.PageableHandlerMethodArgumentResolver

w szczególności w następujący sposób:

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

ten pozwoli ci na korzystanie z aktualnego stronicowania w interfejsie użytkownika, tzn. z pierwszą stroną = 1.

W aplikacji Boot myślę config może wyglądać następująco:

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

Działa, ale mam do czynienia z kilkoma problemami. Czy mogę uzyskać dostęp do zero zindeksowane strony URL "/books?page=0&size=2". Następnie" liczba "atrybut w odpowiedzi jest nadal zindeksowany, mam dostęp do strony: 3, ale uzyskanie atrybutu numeru jako 2," last ": true," totalElements " : 5, "totalPages": 3, "size": 2, "number": 2, "sort": null, "first": false, "numberOfElements": 1 ". Proszę, poprowadź mnie, aby rozwiązać ten problem. – VelNaga

+0

Przepraszam, ale nie rozumiem problemu: chcesz użyć stronicowania opartego na 1, ale zadzwoń "/ books? Page = 0 & size = 2" –

+0

pozwól mi edytować moje pytanie, dzięki czemu uzyskasz lepszą jasność – VelNaga

0

Aby uzyskać lepszy wynik, trzeba rozszerzyć RepositoryRestMvcConfiguration, jak poniżej

@Configuration 
    public class RespositoryConfiguration extends RepositoryRestMvcConfiguration { 

    @Override 
    @Bean 
    public HateoasPageableHandlerMethodArgumentResolver pageableResolver() { 

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

Wtedy można uzyskać wszystkie linki i paginacji poprawne informacje z wyjątkiem "numeru", czyli o jeden mniej. Zobacz wynik dla strony = 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

pracuję z wiosennego startu i Vue.js i miałem ten problem :)

Mam wiele dokumentów więc już wdrożone Pageable tak:

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

Pierwszy raz wzywam document/all i mam stronę 0. Wtedy w każdej chwili nazywam stronę z moim front-end aplikacji page = page -1;.

Tak więc, gdy zadzwonię na stronę 1 z front-end to idzie do strony 0 w back-end itp