2015-09-09 29 views
11

Sto cercando di implementare un metodo controller simile a come è documentato nell'ultimo treno di rilascio di Spring Data di Gosling che supporta QueryDsl. Ho implementato il controller come mostrato nell'esempio nella documentazione di http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#core.web.type-safe. Tutto viene compilato e quando avvio l'applicazione (utilizzando Spring Boot 1.2.5.RELEASE), tutto inizia correttamente.Eccezione utilizzando Spring Data JPA e QueryDsl tramite REST Controller

Tuttavia, quando provo a chiamare il mio riposo endpoint, ho sempre arrivare la seguente eccezione:

org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.mysema.query.types.Predicate]: 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) 

La mia ipotesi è che il QuerydslPredicateArgumentResolver non viene applicato alla richiesta, e, quindi, l'eccezione. Ma vedo che lo QuerydslPredicateArgumentResolver è registrato come bean quando interrogo l'endpoint di gestione Spring Boot /manage/beans. Ho anche assicurato che @EnableSpringDataWebSupport sia nella mia classe @Configuration senza alcun effetto.

Ho il controllore annotato con @BasePathAwareController, poiché sto utilizzando questo con Spring Data REST e voglio che i metodi siano in un percorso simile a quelli esposti da Spring Data REST. Ho anche provato a usare @RepositoryRestController, ma non sembrava importare. Tuttavia, quando si utilizza @RestController e lo si inserisce in un percorso diverso dal percorso di base utilizzato da Spring Data REST, le cose hanno funzionato. Quindi la domanda è, dovrebbe funzionare?

L'intero comando in questo momento è:

@RestController 

@RequestMapping (value = "/ query") public class AvailController { privato AvailRepository finale pronti contro termine;

@Autowired 
public AvailController(AvailRepository repository) 
{ 
    this.repo = repository; 
} 

@RequestMapping(value = "/avails", method = GET) 
public @ResponseBody Page<Avail> getAvails(Model model, 
              @QuerydslPredicate(root = Avail.class) Predicate predicate, 
              Pageable pageable, 
              @RequestParam MultiValueMap<String, String> parameters) 
{ 
    return repo.findAll(predicate, pageable); 
} 
+0

ho ottenuto che funziona, ma con configurazione XML. Forse questo potrebbe aiutare https://stackoverflow.com/questions/32366562/how-do-i-configure-xml-querydsl-to-be-used-with-spring-data-and-spring-mvc –

risposta

-1

Ho riscontrato questo problema anche durante il tentativo di implementare un controller personalizzato che simula il valore restituito come Spring Data REST. Volevo iniettare QuerydslPredicate sul metodo del controller e ottenere la fastidiosa 'BeanInstantiationException'.

Ho trovato un lavoro in giro per questo aggiungendo il seguente file di configurazione per la mia domanda:

@Configuration 
@Order(Ordered.HIGHEST_PRECEDENCE ) 
public class MvcConfig extends WebMvcConfigurerAdapter { 

    @Autowired 
    @Qualifier("repositoryExporterHandlerAdapter") 
    RequestMappingHandlerAdapter repositoryExporterHandlerAdapter; 

    @Override 
    public void addArgumentResolvers(
      List<HandlerMethodArgumentResolver> argumentResolvers) { 
     List<HandlerMethodArgumentResolver> customArgumentResolvers = repositoryExporterHandlerAdapter.getCustomArgumentResolvers(); 
     argumentResolvers.addAll(customArgumentResolvers); 
    } 
} 

Vedi qui per riferimento: https://jira.spring.io/browse/DATAREST-657

0

Ho avuto lo stesso problema con la creazione di un'istanza di predicato. Nell'esempio:

@Controller 
@RequiredArgsConstructor(onConstructor = @__(@Autowired)) 
class UserController { 

private final UserRepository repository; 

@RequestMapping(value = "/", method = RequestMethod.GET) 
String index(Model model, // 
     @QuerydslPredicate(root = User.class) Predicate predicate, // 
     @PageableDefault(sort = { "lastname", "firstname" }) Pageable pageable, // 
     @RequestParam MultiValueMap<String, String> parameters) { 
(...) 

(https://github.com/spring-projects/spring-data-examples/blob/master/web/querydsl/src/main/java/example/users/web/UserController.java#L42) sta usando solo @Controller e stavo usando @RepositoryRestController, che sembra essere il motivo. @RestController funziona anche per me.

ho creato https://jira.spring.io/browse/DATAREST-838

+1

È buono da dare collegamenti ma meglio includere parti essenziali in risposta .. !! –