永远不会调用 Kotlin、Micronaut 和 Hibernate 自定义 bean 验证器
Kotlin, Micronaut and Hibernate custom bean validator is never called
我正在研究 Micronaut 和 Kotlin 在工作中使用 gRPC 的项目,我 运行 遇到了一些我似乎找不到答案的问题。
我正在使用 Kotlin 在 Micronaut 中重述一些个人 Spring 项目。在这些项目中,我创建了一个自定义 bean 验证器注释来验证参数是否重复。我已经在 Kotlin 中重述了它,但它从未被调用过,我也调试了代码,并且它永远不会在验证器的断点处停止。
这是我要验证的实体 class。请注意 @UniqueEmail 注释,这是我的自定义验证器。
@Entity
@Validated
@Introspected
@Suppress("unused")
class Autor(
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
val id: String? = null,
@field:NotNull
val instante: LocalDateTime = LocalDateTime.now(),
@field:NotNull
@field:Email
@UniqueEmail(domainClassName = "Autor")
val email: String,
@field:NotNull
val nome: String,
@field:NotNull
@field:Size(max = 400)
val descricao: String
) {
}
这是验证器注释 class。
@Target(AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME)
@Constraint(validatedBy = [UniqueEmailValidator::class])
@MustBeDocumented
annotation class UniqueEmail(
val message: String = "Email already exists",
val groups: Array<KClass<Any>> = [],
val payload: Array<KClass<Any>> = [],
val field: String = "email",
val domainClassName: String
)
这是验证器本身。这里的整个问题是,Micronaut 从不在这里调用这个方法,这个值从不被验证。其他 bean 注释运行良好,如 @NotNull 和 @Email,但不是这个。
class UniqueEmailValidator(@PersistenceContext val manager: EntityManager) : ConstraintValidator<UniqueEmail, String> {
private lateinit var domainAttribute: String
private lateinit var kClassName: String
override fun initialize(params: UniqueEmail) {
domainAttribute = params.field
kClassName = params.domainClassName
}
override fun isValid(value: String?, context: ConstraintValidatorContext?): Boolean {
if(value.equals("")) return false
val query = manager.createQuery("SELECT e FROM $kClassName WHERE $domainAttribute = :value")
.setParameter("value", value)
return query.resultList.isEmpty()
}
}
我搜索了很多,这是我在 Whosebug 上的第一个问题。由于 Micronaut 是一个相当新的框架,并且没有很多人将 Spring/Micronaut 与 kotlin 一起使用,因此很难找到针对此类错误和特定问题的解决方案。
非常感谢您的帮助。
谢谢
编辑:
这是我的依赖项:
dependencies {
kapt("io.micronaut.data:micronaut-data-processor")
implementation("io.micronaut:micronaut-validation")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlinVersion}")
implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
implementation("io.micronaut.kotlin:micronaut-kotlin-runtime")
implementation("io.micronaut:micronaut-runtime")
implementation("io.micronaut.grpc:micronaut-grpc-runtime")
implementation("javax.annotation:javax.annotation-api")
implementation("io.micronaut.sql:micronaut-jdbc-hikari")
implementation("io.micronaut.sql:micronaut-hibernate-jpa")
implementation("io.micronaut.data:micronaut-data-hibernate-jpa")
implementation("io.micronaut.kafka:micronaut-kafka")
runtimeOnly("org.slf4j:slf4j-simple")
runtimeOnly("com.fasterxml.jackson.module:jackson-module-kotlin")
runtimeOnly("org.postgresql:postgresql")
testImplementation("io.micronaut:micronaut-http-client")
testRuntimeOnly("org.testcontainers:postgresql")
}
UniqueEmailValidator
应该是个bean。它需要一个 @Singleton
注释。
我正在研究 Micronaut 和 Kotlin 在工作中使用 gRPC 的项目,我 运行 遇到了一些我似乎找不到答案的问题。
我正在使用 Kotlin 在 Micronaut 中重述一些个人 Spring 项目。在这些项目中,我创建了一个自定义 bean 验证器注释来验证参数是否重复。我已经在 Kotlin 中重述了它,但它从未被调用过,我也调试了代码,并且它永远不会在验证器的断点处停止。
这是我要验证的实体 class。请注意 @UniqueEmail 注释,这是我的自定义验证器。
@Entity
@Validated
@Introspected
@Suppress("unused")
class Autor(
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
val id: String? = null,
@field:NotNull
val instante: LocalDateTime = LocalDateTime.now(),
@field:NotNull
@field:Email
@UniqueEmail(domainClassName = "Autor")
val email: String,
@field:NotNull
val nome: String,
@field:NotNull
@field:Size(max = 400)
val descricao: String
) {
}
这是验证器注释 class。
@Target(AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME)
@Constraint(validatedBy = [UniqueEmailValidator::class])
@MustBeDocumented
annotation class UniqueEmail(
val message: String = "Email already exists",
val groups: Array<KClass<Any>> = [],
val payload: Array<KClass<Any>> = [],
val field: String = "email",
val domainClassName: String
)
这是验证器本身。这里的整个问题是,Micronaut 从不在这里调用这个方法,这个值从不被验证。其他 bean 注释运行良好,如 @NotNull 和 @Email,但不是这个。
class UniqueEmailValidator(@PersistenceContext val manager: EntityManager) : ConstraintValidator<UniqueEmail, String> {
private lateinit var domainAttribute: String
private lateinit var kClassName: String
override fun initialize(params: UniqueEmail) {
domainAttribute = params.field
kClassName = params.domainClassName
}
override fun isValid(value: String?, context: ConstraintValidatorContext?): Boolean {
if(value.equals("")) return false
val query = manager.createQuery("SELECT e FROM $kClassName WHERE $domainAttribute = :value")
.setParameter("value", value)
return query.resultList.isEmpty()
}
}
我搜索了很多,这是我在 Whosebug 上的第一个问题。由于 Micronaut 是一个相当新的框架,并且没有很多人将 Spring/Micronaut 与 kotlin 一起使用,因此很难找到针对此类错误和特定问题的解决方案。
非常感谢您的帮助。 谢谢
编辑: 这是我的依赖项:
dependencies {
kapt("io.micronaut.data:micronaut-data-processor")
implementation("io.micronaut:micronaut-validation")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlinVersion}")
implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
implementation("io.micronaut.kotlin:micronaut-kotlin-runtime")
implementation("io.micronaut:micronaut-runtime")
implementation("io.micronaut.grpc:micronaut-grpc-runtime")
implementation("javax.annotation:javax.annotation-api")
implementation("io.micronaut.sql:micronaut-jdbc-hikari")
implementation("io.micronaut.sql:micronaut-hibernate-jpa")
implementation("io.micronaut.data:micronaut-data-hibernate-jpa")
implementation("io.micronaut.kafka:micronaut-kafka")
runtimeOnly("org.slf4j:slf4j-simple")
runtimeOnly("com.fasterxml.jackson.module:jackson-module-kotlin")
runtimeOnly("org.postgresql:postgresql")
testImplementation("io.micronaut:micronaut-http-client")
testRuntimeOnly("org.testcontainers:postgresql")
}
UniqueEmailValidator
应该是个bean。它需要一个 @Singleton
注释。