2014-03-02 4 views
12

Ich habe eine einfache Controller-Aktion:Spring Data behandelt nicht Pageable Aktion Argument Schöpfung

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 */ 
    } 
} 

Hier ist mein pom.xml Fragment:

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

Nach addtion das meinem applicationContext.xml:

<bean class="org.springframework.data.web.config.SpringDataWebConfiguration"/> 

Ich habe folgenden Fehler:

org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.data.domain.Pageable]: Specified class is an interface 

Spring Data selbst funktioniert gut, JPA-Repositories funktionieren. Aber bis jetzt hatte ich handgeschriebene Paginierung in den Steuerpulten (eigene Seiten berechnend, PageRequest Gegenstände von Hand verursachend). Ich wollte Spring Data Web-Extras nutzen, aber sie funktionieren nicht für mich aus irgendeinem Grund ... Registrierung veraltet org.springframework.data.web.PageableArgumentResolver von Hand teilweise funktionierte es, aber nicht vollständig, aber immer noch, ich denke nicht, dass dies sogar sollte eine Lösung sein.

Nach der Aktivierung der Debug-Logger auf org.springframework ich sehe, dass:

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

es registriert Also - eine Idee, warum es funktioniert nicht?

+0

es In der Konfiguration durch den 'DispatcherServlet' geladen. Ich nehme an, dass * applicationContext.xml * vom 'ContextLoaderListener' geladen wird. –

+0

Ist das nicht äquivalent? Ich weiß, dass 'applicationContext.xml' von allen Servlets geerbt wird und solange ich nur einen habe, gibt es keinen Unterschied zwischen der Definition der Bean ... Wie auch immer - ich habe versucht, das zu' mailer-servlet zu verschieben .xml' und das Ergebnis ist das gleiche, Protokolle sehen auch gleich aus (Ich sehe die Bean initialisiert und die Webkonfiguration verarbeitet, aber der Fehler tritt im Web auf). –

Antwort

17

Ihr Problem besteht darin, dass Sie versuchen, XML-Konfiguration und Java Config-basierte Konfiguration zu mischen. In diesem speziellen Fall wird das nicht funktionieren. Die Bean in der Konfigurationsklasse wird instanziiert, aber das ist es, sie sind nicht in Ihrer <mvc:annotation-driven /> Konfiguration registriert.

Sie müssen die Beans manuell zu ConversionService und RequestMappingHandlerMapping hinzufügen. Entweder das unser Switch, zumindest Ihre DispatcherServlet Konfiguration zu Java Config.

In XML können Sie zusätzliche Argument-Resolver mit dem Tag <mvc:argument-resolvers /> konfigurieren. (Dies ahmt die Konfiguration von SpringDataWebConfiguration nach).

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

jedoch die SpringDataWebConfiguration mehr tut, dann nur diese 2 Resolver registriert er auch ein DomainClassConverter. Wenn Sie das auch verwenden möchten, benötigen Sie einige zusätzliche Konfiguration.

<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

Vielen Dank, dass Sie darauf hingewiesen haben! Glücklicherweise habe ich herausgefunden, dass '' Element ermöglicht die Anpassung der von Ihnen erwähnten Dienste.Hier ist, was ich brauchte, um es mit '' arbeiten zu lassen. ' ' Vielen Dank. –

+0

sieht aus wie seit dem Frühjahr 3.0, die FormatierungConversionServiceFactoryBean ist jetzt unter org.springframework.format.support.FormattingConversionServiceFactoryBean verpackt – chrismarx

+1

@chrismarx Das war eigentlich ein Tippfehler. Danke, dass du es aufgezeigt hast. –

4

Oder Sie können diese Application zu Benutzer hinzufügen

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

es wird mit Frühling arbeiten 4

+1

Das ist im Grunde das gleiche wie bereits als erste Lösung in meiner Antwort angegeben. –

+1

@ M.Deinum nur kürzer – Aalkhodiry

Verwandte Themen