복붙노트

[SPRING] Spring 데이터는 Pageable 액션 인수 생성을 처리하지 않습니다.

SPRING

Spring 데이터는 Pageable 액션 인수 생성을 처리하지 않습니다.

간단한 컨트롤러 동작이 있습니다.

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

등록 된 이유는 무엇입니까?

해결법

  1. ==============================

    1.문제는 XML 구성과 Java Config 기반 구성을 혼합하려고한다는 것입니다. 이 특별한 경우에는 작동하지 않을 것입니다. 구성 클래스의 bean은 인스턴스화되지만 그것은 구성에 등록되어 있지 않습니다.

    문제는 XML 구성과 Java Config 기반 구성을 혼합하려고한다는 것입니다. 이 특별한 경우에는 작동하지 않을 것입니다. 구성 클래스의 bean은 인스턴스화되지만 그것은 구성에 등록되어 있지 않습니다.

    ConversionService와 RequestMappingHandlerMapping에 Bean을 수동으로 추가해야한다. 적어도 우리의 스위치, 적어도 DispatcherServlet 구성을 Java Config로 설정하십시오.

    XML에서는 태그를 사용하여 추가 인수 확인자를 구성 할 수 있습니다. (이는 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은 DomainClassConverter를 등록하기 만하면이 2 개의 resolver 이상을 수행합니다. 또한이를 사용하려면 몇 가지 추가 구성이 필요합니다.

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

    2.또는 이것을 사용자 ApplicationContext에 추가 할 수 있습니다.

    또는 이것을 사용자 ApplicationContext에 추가 할 수 있습니다.

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

    그것은 스프링 4와 함께 작동합니다

  3. from https://stackoverflow.com/questions/22135002/spring-data-does-not-handle-pageable-action-argument-creation by cc-by-sa and MIT license