应用spring data jpa查问数据分页,默认spring的分页下标page从0开始,而前端对接个别都是从第1页开始,其中有个配置spring.data.web.pageable.one-indexed-parameters,默认为false,即从下标0开始,改成true即为1开始。然而改了之后并没有成果,进行了排查,问题记录如下:

版本 Spring boot version - 2.6.4

起因是应用@EnableSpringDataWebSupport注解,其中默认会加载SpringDataWebConfiguration.class配置类的配置,外面定义了一个bean

@Beanpublic PageableHandlerMethodArgumentResolver pageableResolver() {    PageableHandlerMethodArgumentResolver pageableResolver = new PageableHandlerMethodArgumentResolver(sortResolver.get());    customizePageableResolver(pageableResolver);    return pageableResolver;}

而下面那个spring.data.web.pageable.one-indexed-parameters的配置是在主动注入的SpringDataWebAutoConfiguration.class里应用到的

@Bean@ConditionalOnMissingBeanpublic PageableHandlerMethodArgumentResolverCustomizer pageableCustomizer() {    return (resolver) -> {        Pageable pageable = this.properties.getPageable();        resolver.setPageParameterName(pageable.getPageParameter());        resolver.setSizeParameterName(pageable.getSizeParameter());        resolver.setOneIndexedParameters(pageable.isOneIndexedParameters());        resolver.setPrefix(pageable.getPrefix());        resolver.setQualifierDelimiter(pageable.getQualifierDelimiter());        resolver.setFallbackPageable(PageRequest.of(0, pageable.getDefaultPageSize()));        resolver.setMaxPageSize(pageable.getMaxPageSize());    };}

而后SpringDataWebAutoConfiguration.class这个主动配置类上有个@ConditionalOnMissingBean(PageableHandlerMethodArgumentResolver.class),如果存在了这个bean,则不会主动加载,而SpringDataWebConfiguration类里就有定义了这个bean,造成了抵触。

解决办法就是本人定义一个config,其中在定义一个PageableHandlerMethodArgumentResolverCustomizer的bean

@Configuration@EnableConfigurationProperties(SpringDataWebProperties.class)public class Config {@Bean@ConditionalOnMissingBeanpublic PageableHandlerMethodArgumentResolverCustomizer pageableCustomizer(SpringDataWebProperties properties) {    return (resolver) -> {        Pageable pageable = properties.getPageable();        resolver.setPageParameterName(pageable.getPageParameter());        resolver.setSizeParameterName(pageable.getSizeParameter());        resolver.setOneIndexedParameters(pageable.isOneIndexedParameters());        resolver.setPrefix(pageable.getPrefix());        resolver.setQualifierDelimiter(pageable.getQualifierDelimiter());        resolver.setFallbackPageable(PageRequest.of(0, pageable.getDefaultPageSize()));        resolver.setMaxPageSize(pageable.getMaxPageSize());    };}}