2015-05-05 5 views
10

Я использую Spring 4.1.6.RELEASE и Spring Data Jpa 1.8.0.RELEASE. У меня возникла проблема с созданием org.springframework.data.domain.Pageable bean. Он используется в моем контроллере:Не удалось создать экземпляр Pageable bean

@Controller 
public class ItemsController { 

    @Autowired 
    ProductService itemsService; 

    @RequestMapping(value = "/openItemsPage") 
    public String openItemsPage() { 
     return "items"; 
    } 

    @RequestMapping(value = "/getItems", method = RequestMethod.GET) 
    @ResponseBody 
    public Item[] getItems(Pageable pageable) { 

     return itemsService.getItems(pageable); 
    } 
} 

Также у меня есть следующие XML-конфигурации в моем контексте приложения:

<context:component-scan base-package="com.mobox.controller" /> 

<mvc:annotation-driven> 
    <mvc:argument-resolvers> 
     <beans:bean id="sortResolver" 
       class="org.springframework.data.web.SortHandlerMethodArgumentResolver" /> 
     <beans:bean 
       class="org.springframework.data.web.PageableHandlerMethodArgumentResolver"> 
      <beans:constructor-arg ref="sortResolver" /> 
     </beans:bean> 
    </mvc:argument-resolvers> 
</mvc:annotation-driven> 

И, наконец, я делаю следующий requsr от клиента:

$.ajax({ 
     type: "GET", 
     url: "getProducts?page=0&size=100", 
     ..... 

В журнале tomcat я вижу следующее:

SEVERE: Servlet.service() for servlet [appServlet] in context with path [/a2delivery-web] threw exception [Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.domain.Pageable]: Specified class is an interface] with root cause 
org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.domain.Pageable]: Specified class is an interface 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:101) 
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:137) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:80) 
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:106) 
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77) 
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:129) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
    .................... 

Пожалуйста, помогите мне решить эту проблему, спасибо!

+0

Можете ли вы опубликовать полный исходный код контроллера? –

+0

уверен, обновлено описание контроллера – Dimon

ответ

16

Самый простой способ получить эту работу, чтобы установить @EnableSpringDataWebSupport в вашей конфигурации. Альтернативно, в чистой конфигурации на основе XML объявите SpringDataWebConfiguration как Spring bean.

Это гарантирует, что нужный HandlerMethodArgumentResolver будет зарегистрирован правильно.

+0

Спасибо, кажется, вы правы, но проблема с сталью актуальна. В stacktrace я вижу, что класс HandlerMethodArgumentResolverComposite выполняет задание: для фактического параметра MethodParameter с параметром «parametrType» org.springframework.data.domain.Pageable он должен получить значение PageableHandlerMethodArgumentResolver, но в моем случае он получает org.springframework.web.servlet.mvc .method.annotation.ServletModelAttributeMethodProcessor, почему? – Dimon

+0

Кажется, что ваша настройка конфигурации Spring MVC не применяется. –

+1

Работает, когда все настроено как java-конфигурация, но когда я смешиваю xml и java-confs - нет. Для xml configuratiion работает следующее решение: http://stackoverflow.com/questions/22135002/spring-data-does-not-handle-pageable-action-argument-creation – Dimon

-1

Полезная информация, используемая в методе getItems, является интерфейсом, и пружина не сможет ее создать.

Вы можете

  1. Обеспечить реализацию Java в стиле боба выгружаемого и используется, что вместо выгружаемых в методе GetItems.
  2. Или используйте атрибут ModelAttribute для создания объекта, подлежащего печати (например, PageRequest). Вот ссылка для получения более подробной информации о ModelAttribute: What is @ModelAttribute in Spring MVC?
15

Добавьте следующий к вам вы тестовый класс:

@Inject 
private PageableHandlerMethodArgumentResolver pageableArgumentResolver; 

PageableHandlerMethodArgumentResolver

и настроить его во время установки MockMvc:

@Before 
public void setup() { 
    ... 
    this.mockMvc = MockMvcBuilders.standaloneSetup(resource) 
     .setCustomArgumentResolvers(pageableArgumentResolver) 
     .build(); 
} 
+0

В моем случае он не работал без @EnableSpringDataWebSupport. – heroin

+0

У моего проекта не было @Inject, но я мог бы создать новый файл PageableHandlerMethodArgumentResolver, который помог исправить его. – Loren