2015-09-09 10 views
11

Ich versuche, eine Controller-Methode ähnlich wie in der neuesten Gosling-Release-Zug von Spring Data, die QueryDsl unterstützt dokumentiert. Ich habe den Controller wie im Beispiel in der Dokumentation unter http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#core.web.type-safe gezeigt implementiert. Alles kompiliert und wenn ich die Anwendung starte (mit Spring Boot 1.2.5.RELEASE), fängt alles gut an.Ausnahme mit Spring Data JPA und QueryDsl über REST-Controller

Allerdings, wenn ich versuche, meine Ruhe Endpunkt zu nennen, ich die folgende Ausnahme immer erhalten:

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) 

Meine Vermutung ist, dass die QuerydslPredicateArgumentResolver ist auf die Anforderung nicht angewendet wird, und damit die Ausnahme. Aber ich sehe, dass die QuerydslPredicateArgumentResolver als eine Bean registriert ist, wenn ich den Spring Boot-Endpunkt /manage/beans abfragen. Ich habe auch dafür gesorgt, dass @EnableSpringDataWebSupport auf meiner @Configuration Klasse keinen Effekt hat.

Ich habe die Steuerung mit @BasePathAwareController kommentiert, da ich dies mit Spring Data REST bin und ich möchte, dass die Methoden, wie die, die unter einem ähnlichen Weg sein, die Spring Data REST aussetzt. Ich habe auch versucht mit @RepositoryRestController, aber das schien nicht wichtig. Wenn Sie jedoch @RestController verwenden und es unter einen anderen Pfad stellen als den Basispfad, den Spring Data REST verwendet, haben die Dinge funktioniert. Die Frage ist also, sollte es funktionieren?

jetzt Die gesamte Steuerung ist:

@RestController 

@RequestMapping (value = "/ query") public class AvailController { privaten Repo letzte AvailRepository;

+0

Ich habe es funktioniert, aber mit XML-Konfigurations. Vielleicht hilft dies https://stackoverflow.com/questions/32366562/how-do-i-configure-xml-querydsl-to-be-used-with-spring-data-and-spring-mvc –

Antwort

-1

Ich hatte auch dieses Problem beim Versuch, einen benutzerdefinierten Controller zu implementieren, der den zurückgegebenen Wert als Spring Data REST nachahmt. Ich wollte QuerydslPredicate in die Controller-Methode einspeisen und bekam die lästige 'BeanInstantiationException'.

fand ich eine Arbeit für diese um, indem Sie die folgende Konfigurationsdatei zu meiner Anwendung hinzufügen:

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

Siehe hier als Referenz: https://jira.spring.io/browse/DATAREST-657

0

ich das gleiche Problem mit Instanziierung Prädikat hatte. Im Beispiel:

@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) wird mit nur @Controller und ich wurde mit @RepositoryRestController, dass der Grund zu sein scheint. @RestController funktioniert auch für mich.

I erstellt https://jira.spring.io/browse/DATAREST-838

+1

Es ist gut zu geben Links aber besser, um wesentliche Teile in Antwort zu enthalten .. !! –