我有一个PagingandSorting Repository,它有一个接受可分页对象的方法。 我还有一个通过URL接受可分页对象的控制器。
我的用例是,如果用户在URL中指定了页面大小参数,则必须为可分页对象获取该值。如果他没有提到默认值为50.
但是可分页对象现在默认为20.
任何建议都会有所帮助
答案 0 :(得分:46)
如果您正在讨论Spring Data PagingAndSortingRepository,您可以使用Controller方法上的@PageableDefault
设置默认页面大小,如下所示:
public String listClients(@ModelAttribute FilterForm form, Model model, WebRequest request, @PageableDefault(sort = { "surname",
"forename", "address.town" }, value = 50) Pageable pageable) {
}
或者您可以在Spring配置中使用以下配置全局默认值,如下所示在XML和Java配置中。
请注意,较新版本的Spring Data使用基于零的页面索引,而旧版本使用1作为第一页。如果您的UI分页库需要1作为第一页,那么您可以将oneIndexedParameters
属性设置为true
:
配置是否公开和假设基于1的页码索引 请求参数。默认为false,表示页码为0 在请求中等于第一页。如果设置为true,则为页面 请求中的1号将被视为第一页。
参数:oneIndexedParameters - 要设置的oneIndexedParameters
将Pageable配置为在没有PageableDefault或的情况下用作后备 PageableDefaults(后者仅在传统模式下支持)可以 找到要解析的方法参数。如果将此值设置为null, 请注意,您的控制器方法将被归入其中 case no可在请求中找到可分页数据。注意,这样做 将要求您提供机器人页面和尺寸参数与 请求,因为任何参数都没有默认值 可用。
参数:fallbackPageable - 可用作常规的Pageable 回退。
在XML中,这看起来如下:
<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>
在Java Config中,如下所示:
@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);
}
}
答案 1 :(得分:14)
您可以在application.yml
中进行设置spring.data.rest.default-page-size: 50
答案 2 :(得分:14)
对于Spring Boot 2.X,您有一组参数:
# 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.
答案 3 :(得分:8)
并且,为了完整性,这里是Spring Boot配置的示例。在扩展WebMvcConfigurerAdapter的@Configuration类中,将默认页面大小设置为50个项目,如下所示:
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
resolver.setFallbackPageable(new PageRequest(0, 50));
argumentResolvers.add(resolver);
super.addArgumentResolvers(argumentResolvers);
}
答案 4 :(得分:4)
您可以在Pageable参数之前使用此注释:
@PageableDefault(size = 40)
// so your parameter should be like this:
@PageableDefault(size = 40) Pageable pageable
答案 5 :(得分:1)
这仍然没有很好的文档记录,但对于其他人发现这篇文章,RepositoryRestConfigurerAdapter在那里有所有spring数据rest配置。
@Configuration
public static class RestConfig extends RepositoryRestConfigurerAdapter {
@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
config.setDefaultPageSize(50);
}
}
答案 6 :(得分:0)
如果答案非常好,并且在大多数情况下都应该有所帮助。但是,我使用稍微不同的方法,这允许我为每个模型使用不同的默认页面大小,并且可以使用Spring或系统属性进行配置。
请注意,此方法有一个基本限制,即它不接受随请求提出的任何大小;它虽然使用排序信息。因此,如果您需要能够通过请求参数更改每页返回项目的数量,则此解决方案不适合您。
首先,我创建了一个实用程序类(或者只是控制器中的一个方法),它根据请求Pageable
创建了一个新的Pageable
实例,并配置了页面大小
public static Pageable updatePageable(final Pageable source, final int size)
{
return new PageRequest(source.getPageNumber(), size, source.getSort());
}
在控制器中,我添加了一个保存默认页面大小的变量(如果没有提供配置,则默认值为20):
@Value("${myapplication.model.items-per-page:20}")
private int itemsPerPage;
然后我在请求处理方法中覆盖(即创建一个新的Pageable
实例)默认页面大小:
@RequestMapping(method = RequestMethod.GET)
public Page<Model> websites(final Pageable pageable)
{
return repository.findAll(updatePageable(pageable, itemsPerPage));
}
我为不同的模型/控制器使用不同的默认页面大小变量,然后甚至可以从系统属性进行配置。
答案 7 :(得分:0)
在Spring Boot 2.1.6.RELEASE
中,您可以在下面使用:
@Configuration
public class WebConfig implements WebMvcConfigurer{
@Value("${paging.default.pageSize}")
private int size;
@Value("${paging.default.page}")
private int page;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
resolver.setFallbackPageable(PageRequest.of(page, size));
resolvers.add(resolver);
WebMvcConfigurer.super.addArgumentResolvers(resolvers);
}
}