NoSuchMethodException QueryDSL with Spring Boot & Spring Data Mongo
NoSuchMethodException QueryDSL with Spring Boot & Spring Data Mongo
我正在尝试在使用 Spring 数据 Mongo 2.0.4.RELEASE
& Gradle 的 Spring 引导 2.0.4.RELEASE
应用程序上实施查询 DSL 4.10
。
我在本地使用 Spring Tool Suite for 运行。
是否执行了我从多个来源(包括 Spring 数据文档)找到的以下步骤:
- 创建了
gradle/querydsl.gradle
,其中包含以下要生成的内容 Q
classes
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);
}
}
- 然后在我的跑步者class我添加了
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
。
任何人都可以提供一些解决此问题的建议吗?
似乎参数没有解析为类型。
---- 更新 09/19/19 ----
调试时我发现 class HandlerMethodArgumentResolverComposite
从 argumentResolvers 列表(类型 HandlerMethodArgumentResolver
).此列表不包含 QuerydslPredicateArgumentResolver
。因此它无法解决参数。
这意味着 QuerydslWebConfiguration
没有调用为 Predicate
类型添加的解析器,这反过来表明某些 AutoConfiguration 没有发生。
可能我在这里遗漏了一些注释。
发现我犯的错误,在我的 Configuration
注释 class 上缺少 EnableWebMvc
注释。
详细信息在 this 文档中。
我正在尝试在使用 Spring 数据 Mongo 2.0.4.RELEASE
& Gradle 的 Spring 引导 2.0.4.RELEASE
应用程序上实施查询 DSL 4.10
。
我在本地使用 Spring Tool Suite for 运行。
是否执行了我从多个来源(包括 Spring 数据文档)找到的以下步骤:
- 创建了
gradle/querydsl.gradle
,其中包含以下要生成的内容Q
classes
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);
}
}
- 然后在我的跑步者class我添加了
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
。
任何人都可以提供一些解决此问题的建议吗?
似乎参数没有解析为类型。
---- 更新 09/19/19 ----
调试时我发现 class HandlerMethodArgumentResolverComposite
从 argumentResolvers 列表(类型 HandlerMethodArgumentResolver
).此列表不包含 QuerydslPredicateArgumentResolver
。因此它无法解决参数。
这意味着 QuerydslWebConfiguration
没有调用为 Predicate
类型添加的解析器,这反过来表明某些 AutoConfiguration 没有发生。
可能我在这里遗漏了一些注释。
发现我犯的错误,在我的 Configuration
注释 class 上缺少 EnableWebMvc
注释。
详细信息在 this 文档中。