2014-11-20 11 views
8

Mam repozytorium PagingandSorting, które ma metodę, która jest zbieżna z obiektem podlegającym przeglądaniu. Mam również kontroler, który akceptuje obiekt, który można przeglądać za pośrednictwem adresu URL.Ustawienie domyślnego rozmiaru strony dla obiektu JPA Pageable Obiekt

Moim przypadkiem użycia jest to, że jeśli użytkownik określa parametr rozmiaru strony w adresie URL, należy przyjąć tę wartość dla obiektu, który można przeglądać. Jeśli nie wspomina o wartości domyślnej 50.

Ale obiekt, który można przeglądać, ma teraz wartość domyślną 20.

Wszelkie sugestie pomogłoby

+0

nie jestem zaznajomiony z każdym PagingAndSortingRepository w JPA. Jeśli jest to pytanie w Spring Data, proszę zaznaczyć, że tak jest. –

Odpowiedz

32

Jeśli mówimy o Wiosna Danych PagingAndSortingRepository można ustawić domyślny rozmiar strony za pomocą @PageableDefault na metodzie kontrolera następująco:

public String listClients(@ModelAttribute FilterForm form, Model model, WebRequest request, @PageableDefault(sort = { "surname", 
      "forename", "address.town" }, value = 50) Pageable pageable) { 

    } 

Albo można skonfigurować globalna wartość domyślna, przy użyciu poniższej konfiguracji w Spring, jak pokazano poniżej w konfiguracji XML i Java.

Należy pamiętać, że nowsze wersje danych sprężynowych korzystają z indeksowania stron na podstawie zera, podczas gdy starsze wersje używały 1 dla pierwszej strony. Jeśli UI stronicowania biblioteka oczekuje 1 jako pierwszej stronie następnie można ustawić właściwość oneIndexedParameters true:

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

public void setFallbackPageable (stronicowalnej fallbackPageable)

Konfiguruje stronicowalnej być stosowane jako fallback w przypadku, gdy nie można odwołać się do PageableDefault lub PageableDefaults (ten ostatni jest obsługiwany tylko w trybie starszej wersji). Można znaleźć znaleziony przy parametrze metody do rozstrzygnięcia. Jeśli ustawisz wartość null, , pamiętaj, że metody kontrolera zostaną przekazane do nich w postaci wartości NULL w przypadku, gdy w żądaniu nie będzie danych dostępnych. Zauważ, że zrobienie tego będzie wymagać podania bota strony i parametru wielkości z prośbami , ponieważ nie będzie dostępnych ustawień domyślnych dla żadnego z parametrów .

Parametry: fallbackPageable - Pageable do użycia jako ogólny fallback.

W XML to wygląda następująco następnie:

<mvc:annotation-driven> 
    <mvc:argument-resolvers> 
     <bean class="org.springframework.data.web.PageableHandlerMethodArgumentResolver"> 
      <property name="oneIndexedParameters" value="true"/> 
      <property name="fallbackPageable"> 
       <bean class="org.springframework.data.domain.PageRequest"> 
        <constructor-arg name="page" value="1" /> 
        <constructor-arg name="size" value="10" /> 
       </bean> 
      </property> 
     </bean> 
    </mvc:argument-resolvers> 
</mvc:annotation-driven> 

W Java Config to wygląda jak poniżej:

@Configuration 
public class WebConfig extends WebMvcConfigurerAdapter { 


    @Override 
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { 
     PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver(); 
     resolver.setOneIndexedParameters(true); 
     resolver.setFallbackPageable(new PageRequest(1, 20); 
     argumentResolvers.add(resolver); 
     super.addArgumentResolvers(argumentResolvers); 
    } 
} 
+0

Dzięki, Alan. Ale jest to raczej nazwa = "strona" wartość = "0" dla globalnej konfiguracji, prawda? – Mikhail

+0

Tak. W pewnym momencie nastąpiła zmiana indeksu od 1 do 0, chociaż nadal można to zmienić, aby użyć tego pierwszego, jeśli jest to wymagane. Będę aktualizował, gdy mam minutę. –

7

I, pod względem kompletności, tutaj jest przykładem na wiosnę Konfiguracja rozruchu. W klasie @Configuration który rozciąga WebMvcConfigurerAdapter ustawić domyślny rozmiar strony do 50 przedmiotów tak:

@Override 
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { 
    PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver(); 
    resolver.setFallbackPageable(new PageRequest(0, 50)); 
    argumentResolvers.add(resolver); 
    super.addArgumentResolvers(argumentResolvers); 
} 
0

Świadczone odpowiedzi są bardzo dobre i powinno pomóc w większości przypadków. Używam jednak nieco innego podejścia, które pozwala mi używać innej domyślnej wielkości strony na model i można ją konfigurować za pomocą Spring lub właściwości systemu.

Należy zauważyć, że to podejście ma jedno zasadnicze ograniczenie, a mianowicie, że nie akceptuje żadnego rozmiaru przychodzącego z żądaniem; używa jednak informacji o sortowaniu. Jeśli więc potrzebujesz możliwości zmiany liczby zwracanych elementów na stronę za pomocą parametrów żądania, to rozwiązanie nie jest dla Ciebie.

Przede wszystkim, stworzyłem klasę użytkową (lub tylko metody w kontrolerze), który tworzy nową bazę Pageable instancji na żądanie Pageable i skonfigurowany strona wielkości

public static Pageable updatePageable(final Pageable source, final int size) 
{ 
    return new PageRequest(source.getPageNumber(), size, source.getSort()); 
} 

W kontrolerze dodaję zmienna, która trzyma mnie domyślny rozmiar strony (w tym przypadku wartość domyślna wynosi 20, jeśli konfiguracja nie jest przewidziane):

@Value("${myapplication.model.items-per-page:20}") 
private int itemsPerPage; 

a potem zastąpić (tj utworzyć nową Pageable instancja) domyślny rozmiar strony w sposobie obsługi żądania:

@RequestMapping(method = RequestMethod.GET) 
public Page<Model> websites(final Pageable pageable) 
{ 
    return repository.findAll(updatePageable(pageable, itemsPerPage)); 
} 

używam różnych zmiennych domyślny rozmiar strony dla różnych modeli/sterowników, które następnie mogą zostać skonfigurowane nawet od właściwości systemu.

+0

W tym podejściu nie można ustawić "size" z żądania. Zawsze będzie on nadpisywany domyślnie. – djxak

+0

@djxak, tak, masz rację. Właśnie dodałem informację o ograniczeniu; dzięki. – Tom

9

Można ustawić poniżej application.yml

spring.data.rest.default-page-size: 50 
+1

Próbowałem wielu sposobów na uzyskanie tego ustawienia do pracy i nie wydaje się, że chcesz wpływać (1.4.3.RELEASE) - masz jakieś sugestie? 'spring.data.rest.default-page-size: 99' – Larchy

0

To nadal nie jest dobrze udokumentowany, ale dla nikogo innego znalezienie niniejszego artykułu, RepositoryRestConfigurerAdapter zawiera wszystkie dane wiosna config odpoczynek tam.

@Configuration 
public static class RestConfig extends RepositoryRestConfigurerAdapter { 

    @Override 
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { 
      config.setDefaultPageSize(50); 
    } 

} 
0

Możesz użyć tej adnotacji przed stronicowalnej param:

@PageableDefault(size = 40) 

// so your parameter should be like this: 
@PageableDefault(size = 40) Pageable pageable 
Powiązane problemy