spring-boot - NoSuchMethodException QueryDSL 与 Spring Boot 和 Spring Data Mongo

标签 spring-boot gradle spring-data-mongodb querydsl

我正在尝试在我的 Spring Boot 2.0.4.RELEASE 上实现 Query DSL使用 Spring Data Mongo 的应用程序 2.0.4.RELEASE和 Gradle 4.10 .
我正在使用 Spring Tool Suite 在本地运行它。

我从多个来源(包括 Spring 数据文档)中找到了以下步骤:

  • 已创建 gradle/querydsl.gradle其中有以下内容要生成Q类(class)
  •     apply plugin: "com.ewerk.gradle.plugins.querydsl"
    
        sourceSets {
            main {
                java {
                    srcDir "$buildDir/generated/source/apt/main"
                }
            }
        }
    
        querydsl {
            springDataMongo = true
            querydslSourcesDir = "$buildDir/generated/source/apt/main"
        }
    
        dependencies {
            compile "com.querydsl:querydsl-mongodb:4.1.4"
            compileOnly "com.querydsl:querydsl-apt:4.1.4"
        }
    
        sourceSets.main.java.srcDirs = ['src/main/java']
    
    
  • 从主 build.gradle 调用上述 gradle 文件如下图
  •     buildscript {
    
            ext { springBootVersion = "2.0.4.RELEASE" }
    
            repositories { mavenCentral() }
    
            dependencies {
                classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
                classpath "gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:1.0.9"
            }
        }
    
        plugins {
            id "java"
            id "eclipse"
            id "org.springframework.boot" version "2.0.4.RELEASE"
            id "io.spring.dependency-management" version "1.0.6.RELEASE"
        }
    
        sourceCompatibility = 1.8
    
        repositories { mavenCentral() }
    
        dependencies {
            ...
            compile("org.springframework.boot:spring-boot-starter-web:${springBootVersion}")
            compile("org.springframework.boot:spring-boot-starter-data-mongodb:${springBootVersion}")
            ...
        }
    
        apply from: 'gradle/querydsl.gradle'
    
        /* Added this because Eclipse was not able to find generated classes */
        sourceSets.main.java.srcDirs = ['build/generated/source/apt/main','src/main/java']
    
        compileJava.dependsOn processResources
        processResources.dependsOn cleanResources
    
    
  • 在此之后更新了 Repository注释界面如下。注意:我也使用 Fragment Repository FragmentOrderRepository 对于一些自定义查询。
  •     public interface OrderRepository<D extends OrderDAO>
                extends EntityRepository<D>, PagingAndSortingRepository<D, String>, FragmentOrderRepository<D>, QuerydslPredicateExecutor<D> {}
    
    
  • 然后在 Controller 中创建了一个 GET此处显示的映射
  • 
        @RestController
        public class OrderController {
            @GetMapping(value="/orders/dsl", produces = { "application/json" })
            public ResponseEntity<List> getOrdersDSL(@QuerydslPredicate(root = OrderDAO.class) Predicate predicate, Pageable pageable, @RequestParam final MultiValueMap<String, String> parameters) {
                return (ResponseEntity<List>) orderService.getTools().getRepository().findAll(predicate, pageable);
            }
        }
    
    
  • 然后在我的运行者课上我添加了EnableSpringDataWebSupport注释
  •     @SpringBootApplication
        @EnableSpringDataWebSupport
        public class SampleApp {
            public static void main(String[] args) {
                SpringApplication.run(SampleApp.class, args);
            }
        }
    
    

    有了这个,我的应用程序启动时没有任何错误,但是当我尝试点击路径时 http://localhost:5057/orders/dsl?email=test@test.com
    我得到一个 NoSuchMethodException有消息No primary or default constructor found for interface com.querydsl.core.types.Predicate .

    任何人都可以请一些指针来解决这个问题吗?

    似乎参数没有被解析为一种类型。

    ---- 2019 年 9 月 19 日更新 ----

    在调试时我发现一个类 HandlerMethodArgumentResolverComposite它为给定的 MethodParameter 找到 ArgumentResolver来自 的列表参数解析器 (类型为 HandlerMethodArgumentResolver )。此列表不包含 QuerydslPredicateArgumentResolver .因此它无法解决争论。

    这意味着 QuerydslWebConfigurationPredicate 添加上述解析器type 没有被调用,这反过来表明一些 自动配置 没有发生。

    可能我在这里遗漏了一些注释。

    最佳答案

    发现我正在做的错误,丢失了EnableWebMvc我的 Configuration 上的注释注释类。
    详情在 this文档。

    关于spring-boot - NoSuchMethodException QueryDSL 与 Spring Boot 和 Spring Data Mongo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57972667/

    相关文章:

    java - 如何针对部署在 Openshift(基于云的 Kubernetes)的 Elasticsearch 在 Spring Boot 上使用自签名证书实现 SSL

    java - 如何使用不同的数据库动态重新加载 Spring Data Neo4j 图形数据库服务

    mongodb - 为什么在使用 GeoJsonPoint 执行 nearSphere 查询时会出现 CodecConfigurationException?

    spring-data - SpringData MongoDB 使用投影

    java - 几分钟后,Spring Boot 停止解析 View

    java - Spring Boot 1.4自定义内部Jackson反序列化

    java - 如何使用 Gradle 运行 Jetty

    gradle - 使用gradle任务进行版本增量

    android - JUnit在Android项目中做什么?

    java - 使用 MongoTemplate 获取排序的不同值