【问题标题】:Kotlin, Micronaut and Hibernate custom bean validator is never calledKotlin、Micronaut 和 Hibernate 自定义 bean 验证器从未被调用
【发布时间】:2021-03-08 21:39:32
【问题描述】:

我正在为一个工作项目使用 gRPC 研究 Micronaut 和 Kotlin,但我遇到了一些我似乎无法找到答案的问题。

我正在使用 Kotlin 在 Micronaut 中重新编写一些个人 Spring 项目。在这些项目中,我创建了一个自定义 bean 验证器注释来验证参数是否重复。我在 Kotlin 中重新调用了它,但它从未被调用过,我也调试过代码,它永远不会在验证器的断点处停止。

这是我要验证的实体类。注意@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
) {

}

这是验证器注释类。

@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()
    }

}

我搜索了很多,这是我在 StackOverflow 上的第一个问题。由于 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")
}

【问题讨论】:

    标签: hibernate kotlin bean-validation micronaut micronaut-data


    【解决方案1】:

    UniqueEmailValidator 应该是一个 bean。它需要一个@Singleton 注释。

    【讨论】:

    • 感谢您的回答,但没有奏效。我添加了@Singleton,没有其他任何改变,我也尝试过调试,它从不调用该函数。我也尝试在我的实体中使用@UniqueEmail@field:UniqueEmail,但也没有任何反应。您知道还有其他解决方案吗?你认为可能是一些依赖?谢谢。
    • 您的 UniqueEmailValidator 是否扩展了 micronaut ConstraintValidator
    • 是的。扩展ConstraintValidator 接收我的注释UniqueEmail 和值的类型String
    • @JimC 我不得不放弃这个项目,因为我工作的第一个 Sprint 即将开始,所以我没有太多时间研究这个。我确实设法让 Micronaut 访问注释,但由于某种原因,在内部时,它一直在无限循环中执行,直到编译器抛出 StackOverflowException。我有一个项目的存储库,但我前段时间放弃了它。 Here it is, if you want to check it out,在服务/验证器中
    • @JimC 我的很多问题都与 Gradle 有关。我以前从未使用过它,习惯了Maven。每次更改代码时,我都必须养成运行 Gradle clean build 的习惯……否则某些 Bean 或注释将停止工作。
    猜你喜欢
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2013-11-15
    • 2020-01-10
    • 2014-09-17
    相关资源
    最近更新 更多