3

私は職場のプロジェクトで gRPC を使用して Micronaut と Kotlin を研究していますが、答えが見つからないように見えるいくつかの問題に遭遇しました。

Kotlin を使用して、Micronaut でいくつかの個人的な Spring プロジェクトを再現しています。これらのプロジェクトでは、パラメーターが重複しているかどうかを検証するカスタム Bean バリデーター アノテーションを作成します。Kotlinで再作成しましたが、呼び出されることはありません。コードもデバッグしましたが、バリデーターのブレークポイントで停止することはありません。

これが、検証したい Entity クラスです。@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 がここでこのメソッドを呼び出さず、値が検証されないことです。@NotNull や @Email など、他の Bean アノテーションはうまく機能していますが、これは機能していません。

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 はかなり新しいフレームワークであり、多くの人が kotlin で Spring/Micronaut を使用していないため、エラーやこのような特定の問題に対する解決策を見つけるのは非常に困難です。

助けてくれてありがとう。ありがとう。

編集:ここに私の依存関係があります:

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")
}
4

1 に答える 1