【问题标题】:Spring Data does not handle Pageable action argument creationSpring Data 不处理 Pageable 动作参数创建
【发布时间】:2014-04-03 19:21:58
【问题描述】:

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

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

所以它已注册 - 知道为什么它不起作用吗?

【问题讨论】:

  • 将其添加到DispatcherServlet加载的配置中。我假设 applicationContext.xmlContextLoaderListener 加载。
  • 不是等价的吗?我认为 applicationContext.xml 被所有 servlet 继承,只要我只有一个,我将 bean 定义放在哪里就没有区别......无论如何 - 我尝试将它移动到 mailer-servlet.xml,结果是同样,日志看起来也一样(我看到 bean 已初始化并已处理 web 配置,但 web 上出现错误)。

标签: java spring spring-mvc spring-data


【解决方案1】:

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

您必须手动将 bean 添加到 ConversionService 和您的 RequestMappingHandlerMapping。要么我们的开关,至少你的DispatcherServlet 配置到Java Config。

在 XML 中,您可以使用 &lt;mvc:argument-resolvers /&gt; 标记配置其他参数解析器。 (这模仿了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>

【讨论】:

  • 感谢您指出这一点!幸运的是,我发现 &lt;mvc:annotation-driven&gt; 元素允许自定义您提到的服务。这是我需要使它与&lt;mvc:annotation-driven&gt; 一起工作的内容。 ` `非常感谢。
  • 看起来从 spring 3.0 开始,FormattingConversionServiceFactoryBean 现在打包在 org.springframework.format.support.FormattingConversionServiceFactoryBean 下
  • @chrismarx 这实际上是一个错字。感谢您指出。
  • 如果我们设置 那么什么是 正确的值?如果我给 1 那么所有第 0 个索引值都将丢失...可以给第 0 个索引吗?
  • 您介意解释一下为什么在这种特殊情况下没有注册 ConversionService 吗?
【解决方案2】:

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

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

它适用于 Spring 4

【讨论】:

  • 这与我回答中的第一个解决方案基本相同。
  • @M.Deinum 只是更短
猜你喜欢
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 2019-02-08
  • 1970-01-01
  • 2016-08-05
  • 2019-09-25
  • 2016-06-25
相关资源
最近更新 更多