通过 REST 控制器使用 Spring Data JPA 和 QueryDsl 的异常

我正在尝试实现一种控制器方法,类似于支持QueryDsl的最新Gosling发布序列Spring Data中记录的方法。我已经实现了控制器,如 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 终结点时,我总是收到以下异常:

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)

我的猜测是,没有将 应用于请求,因此是例外。但是我看到 当我查询Spring Boot管理端点时,它被注册为bean。我还确保这对我的班级没有影响。QuerydslPredicateArgumentResolverQuerydslPredicateArgumentResolver/manage/beans@EnableSpringDataWebSupport@Configuration

我用 注释了控制器,因为我将其与Spring Data REST一起使用,并且我希望这些方法与Spring Data REST公开的方法位于相似的路径下。我也尝试过使用,但这似乎并不重要。但是,当使用并将其放在与Spring Data REST使用的基本路径不同的路径下时,事情确实有效。所以问题是,它应该起作用吗?@BasePathAwareController@RepositoryRestController@RestController

现在的整个控制器是:

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

答案 1

我在谓词的实例化方面遇到了同样的问题。在示例中:

@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


答案 2

在尝试实现模拟返回值为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


推荐