2014-03-02 29 views
12

我有一個簡單的控制器操作:春數據不處理可分頁操作參數創建

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> 

addtion在這之後我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() 

所以它的註冊 - 爲什麼它不工作的任何想法?

+0

工作,將它添加到由'DispatcherServlet'加載的配置。我假設* applicationContext.xml *由'ContextLoaderListener'加載。 –

+0

是不是等同?我認爲'applicationContext.xml'被所有的servlet繼承,只要我只有一個,我在哪裏放置bean定義就沒有區別...... 無論如何 - 我試着將它移動到'mailer-servlet .xml'和結果是一樣的,日誌看起來也是一樣的(我看到bean初始化並且web配置被處理,但是錯誤出現在web上)。 –

回答

17

你的問題是你正在嘗試混合XML配置和基於Java配置的配置。在這個特定的情況下,這是不行的。配置類中的bean將被實例化,但是,它們並未註冊到您的配置中。

您將不得不手動添加豆類到ConversionServiceRequestMappingHandlerMapping。無論是我們的交換機,至少你的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> 
+1

感謝您指出這一點! 幸運的是,我發現''mvc:annotation-driven>元素允許定製您提到的服務。這是我需要使用''工作的。 ' ' 非常感謝。 –

+0

看起來像自Spring 3.0以來,FormattingConversionServiceFactoryBean現在打包在org.springframework.format.support.FormattingConversionServiceFactoryBean – chrismarx

+1

@chrismarx這實際上是一個錯字。感謝您指出。 –

4

或者你也可以的ApplicationContext

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

添加該用戶將與彈簧4

+1

這與我在答案中已經提到的第一個解決方案基本相同。 –

+1

@ M.Deinum只有更短 – Aalkhodiry