kotlin - 使用 micronaut 验证其他模块的模型给出 "No bean introspection present."

标签 kotlin micronaut gradle-kotlin-dsl micronaut-data micronaut-rest

当我尝试将 POST 方法主体中的对象发送到 micronaut 应用程序时,我得到: 模型:无法验证 com.example.Model。不存在 Bean 自省(introspection)。请将@Introspected添加到类中并确保启用Micronaut注释处理

该项目的结构由两个模块mainmodel组成。 main 模块依赖于 model 模块。

main 模块仅包含 DefaultTestController 类:

import io.micronaut.http.annotation.Body
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Post
import io.micronaut.validation.Validated
import javax.validation.Valid

@Controller("/test")
@Validated
class DefaultTestController : TestController {

    @Post
    override fun create(@Body @Valid model: Model) {
        println("Model: $model")
    }
}

build.gradle.kts 文件如下所示:

plugins {
    id("org.jetbrains.kotlin.jvm") version "1.6.0"
    id("org.jetbrains.kotlin.kapt") version "1.6.0"
    id("org.jetbrains.kotlin.plugin.allopen") version "1.6.0"
    id("com.github.johnrengelman.shadow") version "7.1.0"
    id("io.micronaut.application") version "3.0.2"
}

version = "0.1"
group = "com.example"

val kotlinVersion = project.properties.get("kotlinVersion")
repositories {
    mavenCentral()
}

micronaut {
    runtime("netty")
    testRuntime("junit5")
    processing {
        incremental(true)
        annotations("com.example.*")
    }
}

dependencies {
    kapt("io.micronaut:micronaut-http-validation:3.2.2")
    implementation("io.micronaut:micronaut-http-client:3.2.2")
    implementation("io.micronaut:micronaut-runtime:3.2.2")
    implementation("io.micronaut.kotlin:micronaut-kotlin-runtime:3.0.0")
    implementation("jakarta.annotation:jakarta.annotation-api:2.0.0")
    implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlinVersion}")
    runtimeOnly("ch.qos.logback:logback-classic:1.2.7")
    implementation("io.micronaut:micronaut-validation:3.2.2")
    runtimeOnly("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.0")
    implementation("io.micronaut:micronaut-inject:3.2.2")
    annotationProcessor("io.micronaut:micronaut-inject-java:3.2.2")

    implementation(project(":model"))
}


application {
    mainClass.set("com.example.ApplicationKt")
}
java {
    sourceCompatibility = JavaVersion.toVersion("11")
}

tasks {
    compileKotlin {
        kotlinOptions {
            jvmTarget = "11"
        }
    }
    compileTestKotlin {
        kotlinOptions {
            jvmTarget = "11"
        }
    }
}

模型模块包含:

  1. 模型类:
import io.micronaut.core.annotation.Introspected
import javax.validation.Valid

@Introspected
data class Model(
    @field:Valid
    val subModel: SubModel
)
  • 子模型类:
  • import io.micronaut.core.annotation.Introspected
    import javax.validation.constraints.Email
    
    @Introspected
    data class SubModel(
        @field:Email
        val email: String
    )
    

    build.gradle.kts 文件如下所示:

    plugins {
        kotlin("jvm")
    }
    
    group = "com.example"
    version = "0.1"
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        implementation(kotlin("stdlib"))
        implementation("io.micronaut:micronaut-validation:3.2.2")
        annotationProcessor("io.micronaut:micronaut-validation:3.2.2")
    
        implementation("io.micronaut:micronaut-http-validation:3.2.2")
        annotationProcessor("io.micronaut:micronaut-http-validation:3.2.2")
    
        implementation("io.micronaut:micronaut-inject:3.2.2")
        annotationProcessor("io.micronaut:micronaut-inject-java:3.2.2")
    }
    

    gradle.properties 文件:

    micronautVersion=3.2.2
    kotlinVersion=1.6.0
    org.gradle.java.installations.auto-download=false
    org.gradle.java.installations.auto-detect=false
    org.gradle.java.installations.fromEnv=JAVA_HOME
    

    当我将模型子模型移动到模块时,一切都按预期工作。 当我从 DefaultTestController 中删除 @Validated@Valid 注释时,它也可以工作,但电子邮件未经过验证。

    我尝试了添加和删除各种依赖项的许多不同可能性(例如此处描述的: Validating the POJO record with Micronaut not workingCannot validate view.model.product.ProductSearchCriteria. No bean introspection present. Please add @Introspected to the class ),但没有按预期工作。有人可以看一下并帮我解决这个问题吗?

    编辑: 这是带有代码示例的存储库:github.com/stefanik36/Micronaut-Introspection-Problem 。它包含 src/test/kotlin/com/example/DefaultTestControllerTest.kt 测试,当 ModelSubModel 类移动到主模块。

    最佳答案

    这可以通过在 model gradle 模块中包含 io.micronaut.library gradle 插件来解决,然后仅使用 io.micronaut:micronaut-validation 需要实现依赖。

    进行这些更改后,model/build.gradle.kts 文件的内容将如下所示:

    plugins {
        kotlin("jvm")
        id("org.jetbrains.kotlin.kapt")
        id("io.micronaut.library")
    }
    
    group = "com.example"
    version = "0.1"
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        implementation("io.micronaut:micronaut-validation")
    }
    

    在此更改之后,在单独的 gradle 模块的类中定义并由 @Introspected 注释的验证将起作用。

    关于kotlin - 使用 micronaut 验证其他模块的模型给出 "No bean introspection present.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70355270/

    相关文章:

    android-studio - Android Studio无法使用Kotlin DSL打开Android项目

    android - StaggeredGridLayoutManager 正在加载左侧的一项,其余的加载右侧

    java - 如何使用 Micronaut 运行 KafkaStream 应用程序?

    intellij-idea - Kotlin 。微航海。 TestNG 测试在 IDEA 中失败,但通过 gradle 通过

    swagger - 将 Micronaut OpenAPI/Swagger 生成器与 grails 4 结合使用

    spring-boot - Spring Boot无法使用Gradle Kotlin DSL解决Spring Boot的依赖关系

    gradle - 如何在gradle中从另一个源集发布第二个库?

    kotlin - Kotlin 如何调度调用运算符?

    kotlin - Kotlin序列中的短路操作

    android - Kotlin 内部类访问外部类?