Я пытался реализовать 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. Заранее спасибо!




Я бы посоветовал вам реорганизовать контроллер, чтобы
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);
Спасибо, я тоже использовал это решение, просто добавил значения по умолчанию, чтобы быть в безопасности.
Выбранное решение - обходной путь. Вы можете заставить 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 в методы контроллера, автоматически созданные из параметров запроса.
Просто чтобы добавить к уже полученным ответам относительно включения @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>