簡體   English   中英

通過REST控制器使用Spring Data JPA和QueryDsl的異常

[英]Exception using Spring Data JPA and QueryDsl via REST Controller

我正在嘗試實現一種控制器方法,類似於支持QueryDsl的最新Gosling發布的Spring Data發布系列中記錄的方法。 我已經實現了控制器,如http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#core.web.type-文檔中的示例所示。 安全 一切都在編譯,當我啟動應用程序時(使用Spring Boot 1.2.5.RELEASE),一切都很順利。

但是,當我嘗試調用我的rest端點時,我總是得到以下異常:

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被注冊為/manage/beans 我還確保@EnableSpringDataWebSupport在我的@Configuration類上沒有任何效果。

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

現在整個控制器是:

@RestController
@RequestMapping(value = "/query")
public class AvailController
{
    private final AvailRepository repo;

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

我對Predicate的實例化有同樣的問題。 在示例中:

@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

在嘗試實現將返回值模擬為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM