如何在Spring启动应用程序中配置PageableHandlerMethodArgumentResolver

时间:2016-02-14 20:57:53

标签: java spring spring-boot

我有一个Spring启动应用程序,我想配置PageableHandlerMethodArgumentResolver,我尝试以下代码,但不起作用:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    // .......

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

控制器方法:

@Override
@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
@RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Page<Account>> query(@QuerydslPredicate Predicate predicate,
        @PageableDefault Pageable pageable) {
    return new ResponseEntity<>(accountRepo.findAll(predicate, pageable), HttpStatus.OK);
}

这是一个简单的启动应用程序,只需使用Spring Boot WebConfig配置类进行弹跳启动

@Configuration
public class WebConfig {

    @Bean
    public Filter html5ModeFilter() {
        return new Html5ModeFilter();
    }
}

这是我的配置类列表:

Html5ModeFilter.java
SecurityConfig.java
ServletInitializer.java
UserDetailsAdapter.java
WebConfig.java

2 个答案:

答案 0 :(得分:4)

从{

>中删除@PageableDefault

public ResponseEntity<Page<Account>> query(..., @PageableDefault Pageable pageable) {
    ...
}

PageableDefault注释如下所示:

public @interface PageableDefault {
    int value() default 10;
    int size() default 10;
    int page() default 0;
    ...
} 

这些default值会覆盖您的后备值,您会看到前十个结果。

答案 1 :(得分:1)

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

  • SortHandlerMethodArgumentResolverCustomizer
  • PageableHandlerMethodArgumentResolverCustomizer

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

@Bean 
PageableHandlerMethodArgumentResolverCustomizer sortCustomizer() {
    // s is PageableHandlerMethodArgumentResolver
    return p -> p.setFallbackPageable(new PageRequest(0, 50));
}

这只是现在设置后备的替代方法。 @Ali Dehghani的回答仍然适用Default覆盖Fallback

Spring Data Web Support