Spring Data不处理Pageable action参数创建

时间:2014-03-02 23:15:20

标签: java spring spring-mvc spring-data

我有一个简单的控制器动作:

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 Data本身运行正常,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()

所以它已注册 - 任何想法为什么它不起作用?

2 个答案:

答案 0 :(得分:18)

您的问题是您正在尝试混合XML配置和基于Java Config的配置。在这种特殊情况下,这是行不通的。配置类中的bean将被实例化,但就是它,它们没有注册到<mvc:annotation-driven />配置。

您必须手动将bean添加到ConversionServiceRequestMappingHandlerMapping。我们的交换机,至少是您对Java Config的DispatcherServlet配置。

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

答案 1 :(得分:4)

或者您可以将其添加到用户ApplicationContext

<mvc:annotation-driven>
    <mvc:argument-resolvers>
        <bean class="org.springframework.data.web.PageableHandlerMethodArgumentResolver" />
    </mvc:argument-resolvers>
</mvc:annotation-driven>

它适用于Spring 4