Не удалось создать экземпляр страницы bean

Я использую Spring 4.1.6.RELEASE и Spring Data Jpa 1.8.0.RELEASE. У меня проблема с созданием org.springframework.data.domain.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)
    ....................

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

Ответ 1

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

Это обеспечит правильную регистрацию необходимого HandlerMethodArgumentResolver.

Ответ 2

Добавьте к вам тестовый класс:

@Inject
private PageableHandlerMethodArgumentResolver pageableArgumentResolver;

PageableHandlerMethodArgumentResolver

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

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

Ответ 3

Pageable, используемый в методе getItems, является интерфейсом, а spring не сможет его создать.

Вы можете либо

  • Предоставьте реализацию стиля Java bean для pageable и используйте это вместо Pageable в методе getItems.
  • Или используйте ModelAttribute для создания объекта, связанного с страницами (например, PageRequest). Вот ссылка для более подробной информации о ModelAttribute: Что такое @ModelAttribute в spring MVC?