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