使用 micronaut 验证来自其他模块的模型给出 "No bean introspection present."
Validate model from other module with micronaut gives "No bean introspection present."
当我尝试将 POST 方法主体中的对象发送到 micronaut 应用程序时,我得到:
模型:无法验证 com.example.Model。不存在 bean 自省。请将@Introspected 添加到 class 并确保启用 Micronaut 注释处理.
项目结构由两个模块main和model组成。 main 模块依赖于 model 模块。
main 模块仅包含 DefaultTestController class:
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"
}
}
}
模型模块包含:
- 型号 class:
import io.micronaut.core.annotation.Introspected
import javax.validation.Valid
@Introspected
data class Model(
@field:Valid
val subModel: SubModel
)
- 子模型 class:
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
当我将 Model 和 SubModel 移动到 main 模块时,一切都按预期工作.
当我从 DefaultTestController 中删除 @Validated
和 @Valid
注释时,它也能正常工作,但电子邮件未经过验证。
我尝试了多种添加和删除各种依赖项的不同可能性(例如,此处描述:Validating the POJO record with Micronaut not working and Cannot 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
测试,当 Model
和 SubModel
classes 将被移动到主模块时,该测试将通过。
这可以通过在 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
注释的更改验证将起作用。
当我尝试将 POST 方法主体中的对象发送到 micronaut 应用程序时,我得到: 模型:无法验证 com.example.Model。不存在 bean 自省。请将@Introspected 添加到 class 并确保启用 Micronaut 注释处理.
项目结构由两个模块main和model组成。 main 模块依赖于 model 模块。
main 模块仅包含 DefaultTestController class:
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"
}
}
}
模型模块包含:
- 型号 class:
import io.micronaut.core.annotation.Introspected
import javax.validation.Valid
@Introspected
data class Model(
@field:Valid
val subModel: SubModel
)
- 子模型 class:
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
当我将 Model 和 SubModel 移动到 main 模块时,一切都按预期工作.
当我从 DefaultTestController 中删除 @Validated
和 @Valid
注释时,它也能正常工作,但电子邮件未经过验证。
我尝试了多种添加和删除各种依赖项的不同可能性(例如,此处描述:Validating the POJO record with Micronaut not working and Cannot 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
测试,当 Model
和 SubModel
classes 将被移动到主模块时,该测试将通过。
这可以通过在 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
注释的更改验证将起作用。