[英]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也適合我。
在嘗試實現將返回值模擬為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.