无法实例化Pageable 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配置:

          

最后,我做了客户的下一次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) .................... 

请帮我解决这个问题,谢谢!

实现此function的最简单方法是在配置中设置@EnableSpringDataWebSupport 。 或者,在基于纯XML的配置中,将SpringDataWebConfiguration声明为Spring bean。

这将确保正确注册必要的HandlerMethodArgumentResolver

将以下内容添加到您的测试类中:

 @Inject private PageableHandlerMethodArgumentResolver pageableArgumentResolver; 

PageableHandlerMethodArgumentResolver

并在MockMvc设置期间配置它:

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

只是为了添加Tom Van Rossom的回复,如果你使用@RunWith(MockitoJUnitRunner.class),你可以在初始化mockMvc时创建一个PageableHandlerMethodArgumentResolver实例(就像Loren所提到的那样).Eg

 mockMvc = MockMvcBuilders.standaloneSetup(restController) .setCustomArgumentResolvers(new PageableHandlerMethodArgumentResolver()) .build(); 

getItems方法中使用的Pageable是一个接口,spring将无法实例化它。

你也可以

  1. 提供Pageable的Java bean样式实现,并在getItems方法中使用它而不是Pageable。
  2. 或者使用ModelAttribute创建Pageable对象(例如,PageRequest)。 以下是有关ModelAttribute的更多详细信息的链接: Spring MVC中的@ModelAttribute是什么?