我正在将现有的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。
我很感激任何帮助,并建议获得正确的分页配置。
答案 0 :(得分:1)
您可能有2个解决方案
PageableHandlerMethodArgumentResolver
注册为@Bean
,这将禁用Spring Data Web的自动配置。BeanPostProcessor
以对现有PageableHandlerMethodArgumentResolver
执行其他配置。 @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建议可能是你最好的选择。