Для интерфейса org.springframework.data.domain.Pageable не найден основной конструктор или конструктор по умолчанию

Я пытался реализовать Pageable в своем RestController и столкнулся с проблемами с этим сообщением об ошибке «Для интерфейса 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. Заранее спасибо!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
18
0
19 797
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Я бы посоветовал вам реорганизовать контроллер, чтобы

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

Я думаю, вам не хватает аннотации перед Pageable (как вы отправляете эти данные от клиента?).

Да спасибо! Это сработало! Всего одно изменение вместо использования нового PageRequest (page, size), который устарел, я использовал Pageable pageable = PageRequest.of(page, size);

Sovan Misra 16.09.2018 17:50

Спасибо, я тоже использовал это решение, просто добавил значения по умолчанию, чтобы быть в безопасности.

Dimitar Vukman 04.05.2020 14:15

Выбранное решение - обходной путь. Вы можете заставить 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());
    }
}

просто дополнение к вышеуказанному идеальному решению, пожалуйста, также включите @@ EnableWebMvc в свою конфигурацию с весенней загрузкой 2.3. * и далее, поскольку ваша реализация WebMvcConfigurer включена @EnableWebMvc. Это позволит внедрять экземпляры Pageable в методы контроллера, автоматически созданные из параметров запроса.

Mohit Darmwal 28.07.2020 11:30

Просто чтобы добавить к уже полученным ответам относительно включения @EnableSpringDataWebSupport с помощью аннотации. Это уже должно быть включено с автоматической настройкой весенней загрузки. Возможно, вам потребуется проверить свою конфигурацию, или этот класс автоматической конфигурации исключен с помощью конфигурации java или в свойствах приложения.

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

Если вы используете Решение Клемана Пуассонье, проверьте, не перекрывает ли класс конфигурации другой.

У меня была такая же проблема, и приведенное ниже решение не могло ее исправить:

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

У меня все еще было сообщение:

No primary or default constructor found for interface 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());
        }
    }
}

Вам также может не понадобиться @EnableSpringDataWebSupport, как указано Ответ Джона Пола Мура

У меня была такая же проблема с приложением WebFlux. Spring Boot 2.4.0 пропускает соответствующий @EnableSpringDataWebSupport для реактивных приложений, но, к счастью, обеспечивает работающую реализацию преобразователя. Вы можете включить его следующим образом:

@Configuration
public class PageableWebFluxConfiguration implements WebFluxConfigurer {

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

}

Для загрузочного кода, отличного от Spring:

Я имел дело с существующей базой кода Spring mvc без весенней загрузки, в xmls уже был зарегистрирован bean-компонент RequestMappingHandlerAdapter, поэтому мне пришлось сделать это

    <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>

Другие вопросы по теме