Spring Данные не обрабатывают создание аргумента в файле данных.
У меня есть простое действие контроллера:
public class CategoriesController
{
@RequestMapping(value = { "/", "" })
public String list(
Model model,
@PageableDefault(size = CategoriesController.PAGE_LIMIT) Pageable pager
)
{
// load page data
Page<Category> page = this.categoryService.findAll(pager);
/* action logic here */
}
}
Вот мой фрагмент pom.xml
:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>1.6.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.5.0.RELEASE</version>
</dependency>
После добавления этого к моему applicationContext.xml
:
<bean class="org.springframework.data.web.config.SpringDataWebConfiguration"/>
У меня есть следующая ошибка:
org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.data.domain.Pageable]: Specified class is an interface
Spring Сама по себе работа прекрасна, репозитории JPA работают. Но до сих пор у меня была рукописная разбивка на страницы в контроллерах (вычисление страниц самостоятельно, создание объектов PageRequest
вручную). Я хотел использовать веб-приложения Spring Data, но они почему-то не работают для меня... регистрация устаревшего org.springframework.data.web.PageableArgumentResolver
вручную частично заставила его работать, но не полностью, но все же я не подумайте, что это даже должно быть решением.
После включения журнала отладки на org.springframework
я вижу, что:
01:37:33.850 [localhost-startStop-1] DEBUG org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader - Registering bean definition for @Bean method org.springframework.data.web.config.SpringDataWebConfiguration.pageableResolver()
Итак, он зарегистрировался - любая идея, почему он не работает?
Ответы
Ответ 1
Ваша проблема заключается в том, что вы пытаетесь настроить XML-конфигурацию и конфигурацию на основе Java Config. В этом конкретном случае это не сработает. bean в классе конфигурации будет создан, но он не зарегистрирован в вашей конфигурации <mvc:annotation-driven />
.
Вам нужно будет добавить beans вручную в ConversionService
и ваш RequestMappingHandlerMapping
. Или наш коммутатор, по крайней мере, ваш конфигуратор DispatcherServlet
в конфигурацию Java.
В XML вы можете настроить дополнительные аргументы-резольверы с помощью тега <mvc:argument-resolvers />
. (Это подражает конфигурации из SpringDataWebConfiguration
).
<mvc:annotation-driven>
<mvc:argument-resolvers>
<ref bean="sortResolver"/>
<ref bean="pageableResolver" />
</mvc:argument-resolvers>
</mvc:annotation-driven>
<bean id="sortResolver" class="org.springframework.data.web.SortHandlerMethodArgumentResolver" />
<bean id="pageableResolver" class="org.springframework.data.web.PageableHandlerMethodArgumentResolver">
<constructor-arg ref="sortResolver" />
</bean>
Однако SpringDataWebConfiguration
делает больше, чем только эти 2 резольвера, он также регистрирует DomainClassConverter
. Если вы также захотите использовать это, вам понадобится дополнительная настройка.
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
<bean class="org.springframework.data.repository.support.DomainClassConverter">
<constructor-arg ref="conversionService" />
</bean>
<mvc:annotation-driven conversion-service="conversionService">
<mvc:argument-resolvers>
<ref bean="sortResolver"/>
<ref bean="pageableResolver" />
</mvc:argument-resolvers>
</mvc:annotation-driven>
<bean id="sortResolver" class="org.springframework.data.web.SortHandlerMethodArgumentResolver" />
<bean id="pageableResolver" class="org.springframework.data.web.PageableHandlerMethodArgumentResolver">
<constructor-arg ref="sortResolver" />
</bean>
Ответ 2
Или вы можете добавить это к пользователю ApplicationContext
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="org.springframework.data.web.PageableHandlerMethodArgumentResolver" />
</mvc:argument-resolvers>
</mvc:annotation-driven>
он будет работать с Spring 4