找不到接口org.springframework.data.domain.Pageable的主要或默认构造函数

时间:2018-09-16 15:13:12

标签: java spring-boot

我试图在我的RestController中实现Pageable,并遇到以下错误消息“找不到接口org.springframework.data.domain.Pageable的主要或默认构造函数”的问题

我的控制器是

@GetMapping("/rest/category/all/page")
public Page<ItemCategory> getAllItemCategoryByPage(Pageable pageable){
    Page<ItemCategory> categories = itemCategoryService.getAllItemCategoriesByPageable(pageable);
    return categories;
}

我在这里做错了什么。这是一个Spring Boot 2.0应用程序。 提前致谢!

6 个答案:

答案 0 :(得分:5)

所选解决方案是一种解决方法。您可以使用以下配置使Spring自动解析参数:

import org.springframework.context.annotation.Configuration;
import org.springframework.data.web.PageableHandlerMethodArgumentResolver;
import org.springframework.data.web.config.EnableSpringDataWebSupport;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
@EnableSpringDataWebSupport
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add( new PageableHandlerMethodArgumentResolver());
    }
}

答案 1 :(得分:3)

我建议将您的控制器重构为

public List<ItemCategory> getAllItemCategoryByPage(@RequestParam("page") int pageIndex, 
                                                   @RequestParam("size") int pageSize){
     return itemCategoryService
                   .getAllItemCategoriesByPageable(PageRequest.of(pageIndex, pageSize)).getContent();
}

我认为您在Pageable之前缺少注释(如何从客户端发送数据?)。

答案 2 :(得分:3)

如果您使用Clément Poissonnier's solution,请检查配置类是否不覆盖另一个配置类

我遇到了同样的问题,下面的解决方案无法解决它:

@Configuration
@EnableSpringDataWebSupport
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add( new PageableHandlerMethodArgumentResolver());
    }
}

我仍然收到消息:

  

找不到接口的主要或默认构造函数   org.springframework.data.domain.Pageable

然后我意识到该项目具有Swagger配置类

@Configuration
@EnableSwagger2
public class SwaggerConfiguration extends WebMvcConfigurationSupport {
    // Swagger configuration...
}

,并且上面的 WebMvcConfig配置被忽略

解决方案是仅具有一个配置类:

@Configuration
@EnableSwagger2
public class WebMvcConfig extends WebMvcConfigurationSupport {
    // Swagger configuration...

    @Override
        public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
            argumentResolvers.add( new PageableHandlerMethodArgumentResolver());
        }
    }
}

您可能还不需要John Paul Moore's answer

指出的 @EnableSpringDataWebSupport

答案 3 :(得分:1)

只需添加到已经给出的有关使用注释启用@EnableSpringDataWebSupport的答案中即可。应该已经通过spring boot auto configuration启用了。您可能需要检查配置,或​​者是否使用Java config或应用程序属性排除了此自动配置类。

   org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration

答案 4 :(得分:1)

我在WebFlux应用程序中遇到了同样的问题。 Spring Boot 2.4.0错过了反应式应用程序对应的@EnableSpringDataWebSupport,但幸运的是提供了有效的解析器实现。您可以通过以下方式启用它:

@Configuration
public class PageableWebFluxConfiguration implements WebFluxConfigurer {

    @Override
    public void configureArgumentResolvers(ArgumentResolverConfigurer configurer) {
        configurer.addCustomResolver(new ReactivePageableHandlerMethodArgumentResolver());
    }

}

答案 5 :(得分:0)

对于非 Spring Boot 代码:

我正在处理一些没有 spring boot 的现有 spring mvc 代码库,xmls 中已经注册了一个 RequestMappingHandlerAdapter bean,所以我不得不这样做

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        ...
        <property name="customArgumentResolvers">
            <list>
                <bean class="org.springframework.data.web.PageableHandlerMethodArgumentResolver">
                </bean>
            </list>
        </property>
    </bean>