从Spring Boot 1.3升级到Spring Boot 1.4并且Pageable无法按预期工作。

时间:2016-09-27 13:30:21

标签: spring-boot

我正在将现有的Spring Boot应用程序从1.3.6转换为1.4.1。我希望存储库和控制器响应的默认页面大小为25.在任何一种情况下,我都没有获得预期的行为。对于存储库方法,我得到的页面大小为20.对于控制器,我的页面大小为0。

我添加了一个新配置类来定义默认页面大小。我在另一篇文章中找到了这段代码。调试消息确实打印出来。

@Configuration
public class RestConfigurationAdapter extends WebMvcConfigurerAdapter {

    private static final int DEFAULT_PAGE_SIZE = 25;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        System.out.println("DEBUG: AddArguments----");
        PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
        resolver.setFallbackPageable(new PageRequest(0, DEFAULT_PAGE_SIZE));
        argumentResolvers.add(resolver);
        super.addArgumentResolvers(argumentResolvers);
    }


}

在自定义控制器中,我希望打印一个大小为25的默认可分页。但是此控制器中的可分页对象为空。在1.3.x中,可分页对象按预期工作。

public class BatchManagerController
{
    @Autowired
    private BatchRepository batchRepository;

    @Autowired
    private PagedResourcesAssembler pagedResourcesAssembler;

    @Transactional(readOnly = true)
    @RequestMapping(value = "/search/managerBatchView", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    @PreAuthorize("hasRole(T(com.nextgearcapital.tms.api.util.AuthorityEnum).MANAGER)")
    public ResponseEntity<?> getManagerBatchListView(BatchListSearchRequest requestDTO, Pageable pageable, PersistentEntityResourceAssembler myAssembler)
    {
        System.out.println("DEBUG1:---------- " + pageable);
        Page<Batch> batchPage = batchRepository.findBatchesForManager(requestDTO, pageable);
        PagedResources<VaultResource> pagedResources = pagedResourcesAssembler.toResource(batchPage, myAssembler);
        return new ResponseEntity<>(pagedResources, HttpStatus.OK);
    }
}

使用可分页参数调用SDR Repository方法时,该参数可正常工作,但默认页面大小为20,而不是25。

我很感激任何帮助,并建议获得正确的分页配置。

2 个答案:

答案 0 :(得分:1)

您可能有2个解决方案

  1. PageableHandlerMethodArgumentResolver注册为@Bean,这将禁用Spring Data Web的自动配置。
  2. 创建BeanPostProcessor以对现有PageableHandlerMethodArgumentResolver执行其他配置。
  3. 使用@Bean

    @Configuration
    public class RestConfigurationAdapter extends WebMvcConfigurerAdapter {
    
        private static final int DEFAULT_PAGE_SIZE = 25;
    
        @Bean
        public PageableHandlerMethodArgumentResolver pageableResolver() {
            PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
            resolver.setFallbackPageable(new PageRequest(0, DEFAULT_PAGE_SIZE));
            return resolver;
       }
    
        @Override
        public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
            System.out.println("DEBUG: AddArguments----");
            argumentResolvers.add(pageableResolver());
        }
    }
    

    缺点是它将禁用Spring Data Web的自动配置,因此您可能会遗漏一些内容。

    使用BeanPostProcessor

    @Bean
    public BeanPostProcessor pageableProcessor() {
    
        private static final int DEFAULT_PAGE_SIZE = 25;
    
        return new BeanPostProcessor() {
            public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
                if (bean instanceof PageableHandlerMethodArgumentResolver) {
                    ((PageableHandlerMethodArgumentResolver) bean).setFallbackPageable(new PageRequest(0, DEFAULT_PAGE_SIZE));
                }
                return bean;
            }
    
            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
                return bean;
            }
        }
    }
    

    缺点是,将自己的PageableHandlerMethodArgumentResolver实例注册为bean会稍微复杂一些。然而,优点是你可以简单地使用它来为现有bean添加额外的配置并保持自动配置。

答案 1 :(得分:0)

spring-data-commons版本2.0开始,有2个新类可能使这种事情变得更容易:

  • SortHandlerMethodArgumentResolverCustomizer
  • PageableHandlerMethodArgumentResolverCustomizer

不幸的是,这不是Spring Boot当前版本(1.5.9)附带的版本,因此需要您自担风险。

@Bean 
PageableHandlerMethodArgumentResolverCustomizer pagingCustomizer() {
    // p is PageableHandlerMethodArgumentResolver
    return p -> p.setMaxPageSize(25);
}

在这种情况下,可能会调用resolveArgument来操纵它。

那就是说,我不确定spring-data-rest会使用该配置。有HateoasPageableHandlerMethodArgumentResolver似乎更有可能是我认为SDR会使用的来源。如果是这种情况,BeanPostProcessor @M。 Deinum建议可能是你最好的选择。

Spring Data Web Support