[NoSuchMethodException QueryDSL with Spring Boot和Spring Data Mongo

问题描述 投票:1回答:1

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

我从包括Spring数据文档在内的多个来源找到了以下步骤:

  • 创建的gradle/querydsl.gradle,其内容如下,以生成Q类:>
    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> {}

  • 然后在控制器中创建了一个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/[email protected]

我收到带有消息NoSuchMethodExceptionNo primary or default constructor found for interface com.querydsl.core.types.Predicate

任何人都可以提供一些帮助解决此问题的指针吗?

似乎参数未解析为类型。

---- UPDATE 09/19/19

----

[在调试时,我发现一个类HandlerMethodArgumentResolverComposite,它从argumentResolvers

列表(类型MethodParameter)中找到给定HandlerMethodArgumentResolver的ArgumentResolver。该列表不包含QuerydslPredicateArgumentResolver。因此,它无法解析参数。

这意味着没有为上面的QuerydslWebConfiguration类型添加解析器的Predicate被调用,这反过来表明某些AutoConfiguration

没有发生。

可能我在这里缺少一些注释。

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

spring-boot gradle spring-data-mongodb querydsl
1个回答
0
投票

发现我在做的错误,在我的EnableWebMvc带注释的类上缺少Configuration注释。详细信息在this文档中。

© www.soinside.com 2019 - 2024. All rights reserved.