2015-05-05 12 views
10

Uso Spring 4.1.6.RELEASE e Spring Data Jpa 1.8.0.RELEASE. Ho un problema con org.springframework.data.domain.Impostazione di beanizzabile. E 'utilizzato nel mio controller:Impossibile istanziare il bean pagabile

@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); 
    } 
} 

Inoltre ho un prossimo configurazioni XML nel mio contesto di applicazione:

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

E finalmente faccio un prossimo requsr dal client:

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

Nel registro tomcat vedo successivo:

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

Per favore aiutatemi a risolvere questo problema, grazie!

+0

Potete per favore pubblicare il sorgente completo del controller? –

+0

sicuro, descrizione controller aggiornato – Dimon

risposta

16

Il modo più semplice per ottenere questo lavoro è quello di impostare @EnableSpringDataWebSupport nella configurazione. In alternativa, in una configurazione basata su XML, dichiarare SpringDataWebConfiguration come bean Spring.

Questo farà sì che il necessario HandlerMethodArgumentResolver sarà registrato correttamente.

+0

Grazie, sembra che tu abbia ragione, ma il problema dell'acciaio è reale. In stacktrace vedo che la classe HandlerMethodArgumentResolverComposite fa un lavoro: per il parametro MethodParameter effettivo con "parametrType" org.springframework.data.domain.Pageable dovrebbe ottenere PageableHandlerMethodArgumentResolver, ma nel mio caso Ottiene org.springframework.web.servlet.mvc .method.annotation.ServletModelAttributeMethodProcessor, perché? – Dimon

+0

Sembra che la personalizzazione della configurazione di Spring MVC non sia applicata. –

+1

Funziona quando tutto è configurato come configurazione basata su java, ma quando sto mixando i conf i xml e java non lo sono. Per la configurazione xml funziona la soluzione successiva: http://stackoverflow.com/questions/22135002/spring-data-does-not-handle-pageable-action-argument-creation – Dimon

-1

Pageable utilizzato nel metodo getItems è un'interfaccia e spring non sarà in grado di istanziarlo.

è possibile

  1. Fornire un'implementazione stile bean Java di paginabile ed usato che invece di paginabile nel metodo getItems.
  2. Oppure utilizzare ModelAttribute per creare un oggetto Pageable (ad esempio, PageRequest). Ecco un link per maggiori informazioni su ModelAttribute: What is @ModelAttribute in Spring MVC?
15

Aggiungere il seguente alla prenotazione Sei classe di test:

@Inject 
private PageableHandlerMethodArgumentResolver pageableArgumentResolver; 

PageableHandlerMethodArgumentResolver

e configurarlo durante l'installazione MockMvc:

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

Nel mio caso non funzionava senza @EnableSpringDataWebSupport. – heroin

+0

Il mio progetto non ha avuto @Inject, ma ho potuto creare un nuovo PageableHandlerMethodArgumentResolver che ha aiutato a risolverlo. – Loren

Problemi correlati