2015-09-09 49 views
11

我試圖實現一個控制器方法,類似於最新的支持QueryDsl的Spring Data的Gosling發行版本中記錄的方法。我已經實施了控制器,如文檔http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#core.web.type-safe中的示例所示。一切都編譯完成,當我啓動應用程序(使用Spring Boot 1.2.5.RELEASE)時,一切都很順利。通過REST控制器使用Spring Data JPA和QueryDsl的異常

然而,當我嘗試打電話給我休息終點,我總是得到以下異常:

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) 

我的猜測是,QuerydslPredicateArgumentResolver沒有被應用到該請求,並由此例外。但是當我查詢Spring Boot管理端點/manage/beans時,我看到QuerydslPredicateArgumentResolver被註冊爲bean。我也確保@EnableSpringDataWebSupport在我的@Configuration類別上無效。

我有控制器註釋@BasePathAwareController,因爲我在Spring Data REST中使用了這個方法,我希望這些方法與Spring Data REST公開的類似。我也嘗試使用@RepositoryRestController,但這似乎並不重要。但是,當使用@RestController並將其放在不同於Spring Data REST正在使用的基本路徑的路徑下時,情況就起作用了。所以問題是,它應該工作嗎?

整個控制器現在的問題是:

@RestController 

@RequestMapping(值= 「/查詢」) 公共類AvailController { 私人最終AvailRepository回購;

@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

我得到它的工作,但與XML配置。也許這可能有助於https://stackoverflow.com/questions/32366562/how-do-i-configure-xml-querydsl-to-be-used-with-spring-data-and-spring-mvc –

回答

-1

我在試圖實現一個自定義控制器來模仿Spring Data REST的返回值時也遇到了這個問題。我想將QuerydslPredicate注入控制器方法,並得到了惱人的'BeanInstantiationException'。

我發現了一個解決有關此通過添加下面的配置文件,以我的應用程序:

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

看到這裏供參考:https://jira.spring.io/browse/DATAREST-657

0

我有同樣的問題與謂語的實例。在這個例子中:

@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)是隻使用@Controller和我用@RepositoryRestController,這似乎是這個原因。 @RestController也適用於我。

我創建了https://jira.spring.io/browse/DATAREST-838

+1

它很好給鏈接,但更好地包括在答案的重要部分..! –

相關問題