mongodb - 是否可以通过 gradle (Kotlin-DSL) 为 Kotlin MongoDB 文档生成 Q 类?

标签 mongodb spring-boot kotlin querydsl gradle-kotlin-dsl

我有一个使用 Maven、Kotlin、QueryDSL、Spring Boot 和 MongoDB 的项目。它运行得很好,但我认为迁移到 Gradle 可以加快它的构建速度。在我开始使用 QueryDSL 移动模块之前,一切都很好。事实证明,我无法为用 @Document 注释的 Kotlin 类生成 Q 类。 那么有没有办法解决呢? 文档示例(放置在/src/main/kotlin/com/company,位于 kotlin 目录中):

package ...
import org.springframework.data.annotation.Id
import org.springframework.data.mongodb.core.mapping.Document

@Document(collection = "myDocument")
data class MyDocument(
        val smth: String
) 

maven(负责生成的部分)

<plugin>
                    <groupId>org.jetbrains.kotlin</groupId>
                    <artifactId>kotlin-maven-plugin</artifactId>
                    <version>${kotlin.version}</version>

                    <configuration>
                        <args>
                            <arg>-Werror</arg>
                        </args>
                        <annotationProcessors>
                            org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor
                        </annotationProcessors>
                        <compilerPlugins>
                            <plugin>spring</plugin>
                        </compilerPlugins>
                    </configuration>

                    <dependencies>
                        <dependency>
                            <groupId>org.jetbrains.kotlin</groupId>
                            <artifactId>kotlin-maven-noarg</artifactId>
                            <version>${kotlin.version}</version>
                        </dependency>
                        <dependency>
                            <groupId>org.jetbrains.kotlin</groupId>
                            <artifactId>kotlin-maven-allopen</artifactId>
                            <version>${kotlin.version}</version>
                        </dependency>
                    </dependencies>

                    <executions>
                        <execution>
                            <id>compile</id>
                            <phase>compile</phase>
                            <configuration>
                                <sourceDirs>
                                    <sourceDir>${project.basedir}/src/main/kotlin</sourceDir>
                                    <sourceDir>${project.basedir}/src/main/java</sourceDir>
                                </sourceDirs>
                            </configuration>
                            <goals>
                                <goal>compile</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>kapt</id>
                            <goals>
                                <goal>kapt</goal>
                            </goals>
                            <configuration>
                                <sourceDirs>
                                    <sourceDir>${project.basedir}/src/main/kotlin</sourceDir>
                                    <sourceDir>${project.basedir}/src/main/java</sourceDir>
                                </sourceDirs>
                            </configuration>
                        </execution>
                        <execution>
                            <id>test-compile</id>
                            <phase>test-compile</phase>
                            <configuration>
                                <sourceDirs>
                                    <sourceDir>${project.basedir}/src/test/kotlin</sourceDir>
                                </sourceDirs>
                            </configuration>
                            <goals>
                                <goal>test-compile</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>

对于 gradle+kotlin AFAIU,我们必须使用 kapt 以这种方式生成 Q 类

kapt("com.querydsl:querydsl-apt:4.2.1:jpa")

但它对我不起作用,我的新 build.gradle.kts:

import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id("org.springframework.boot") version "2.2.0.RELEASE"
    id("io.spring.dependency-management") version "1.0.8.RELEASE"
    kotlin("jvm") version "1.3.50"
    kotlin("kapt") version "1.3.50"
    kotlin("plugin.jpa") version "1.3.50"
    id("org.jetbrains.kotlin.plugin.spring") version "1.3.21"
}

apply(plugin = "kotlin")
apply(plugin = "kotlin-kapt")
apply(plugin = "kotlin-jpa")
apply(plugin = "org.springframework.boot")
apply(plugin = "io.spring.dependency-management")


group = "com.example"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_1_8

repositories {
    mavenCentral()
}


dependencies {
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    implementation("com.querydsl:querydsl-jpa")
    implementation("com.querydsl:querydsl-apt")

    kapt("com.querydsl:querydsl-apt:4.2.1:jpa")
    kapt("org.springframework.boot:spring-boot-starter-data-jpa")
    kapt("org.springframework.boot:spring-boot-configuration-processor")
    kapt("org.springframework.data:spring-data-mongodb:2.2.0.RELEASE")


    implementation("org.springframework.boot:spring-boot-starter-data-mongodb")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    testImplementation("org.springframework.boot:spring-boot-starter-test") {
        exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
    }
}

//sourceSets { main["kotlin"].srcDirs += [generated] }
//val querydslSrcDir = "src/main/generated"

tasks.withType<Test> {
    useJUnitPlatform()
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs = listOf("-Xjsr305=strict")
        jvmTarget = "1.8"
    }
}

在maven中我可以精确设置注释处理器(org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor),但在gradle中我不知道如何实现它。

最佳答案

您应该在依赖项中添加implementation("com.querydsl:querydsl-mongodb")kapt("com.querydsl:querydsl-apt") 部分。

然后在依赖项部分后添加以下内容。

kapt {
    annotationProcessor("org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor")
}

另外,不要忘记删除那些 JPA 依赖项。

This is a working example i created.

关于mongodb - 是否可以通过 gradle (Kotlin-DSL) 为 Kotlin MongoDB 文档生成 Q 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58725636/

相关文章:

mongodb - mgo:查找类型为 number (int, float64) 的字段不起作用

python - MongoKit 无模式

Spring Boot拦截器返回JSON

node.js - 无法连接到 127.0.0.1 :27017, 原因:errno:111 连接被拒绝

mongodb - 使用另一个字段的值更新 MongoDB 字段

java - Docker 容器中 PostgreSQL 数据库的正确 JDBC 连接 URL

java - @Componenscan 在 Springboot Spring MVC 应用程序中的使用

android - Kotlin 多平台 : How to mock objects in a unit test for iOS

generics - 如何修复 kotlin 中通用扩展方法的签名以解析 kotlin 中的 "Type inference failed"

Kotlin:filterNotNull 用于 Map<K,V?> 中的值