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)
....................
この問題を解決するために私を助けてください、ありがとう!
これを機能させる最も簡単な方法は、@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 Runsomの返信に追加するためだけに、@ RunWith(MockitoJUnitRunner.class)を使用する場合、mockMvcを初期化するときに、PageableHandlerMethodArgumentResolverのインスタンスを作成できます(Lorenが述べたように)。
mockMvc = MockMvcBuilders.standaloneSetup(restController)
.setCustomArgumentResolvers(new PageableHandlerMethodArgumentResolver())
.build();
あなたのために働くかもしれない他の答え以外の代替方法。
@Configuration
@ComponentScan(basePackages = {"my.package1", "my.package2"})
@EnableWebMvc
public class SpringMVCRestConfiguration extends WebMvcConfigurerAdapter {
//Adding the resolver for Pagination and Sorting Resolver
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(paginationResolver());
argumentResolvers.add(sortResolver());
}
//Inject the sortResolver
@Bean
public SortHandlerMethodArgumentResolver sortResolver() {
SortHandlerMethodArgumentResolver argumentResolver = new SortHandlerMethodArgumentResolver();
return argumentResolver;
}
//Inject the Pagination Resolver
@Bean
public PageableHandlerMethodArgumentResolver paginationResolver() {
PageableHandlerMethodArgumentResolver argumentResolver = new PageableHandlerMethodArgumentResolver();
argumentResolver.setMaxPageSize(10);
argumentResolver.setOneIndexedParameters(true);
return argumentResolver;
}
}