当前位置: 首页 > 知识库问答 >
问题:

静态编程语言,Micronaut和HiberNate自定义bean验证器从不被调用

商迪
2023-03-14

我正在研究Micronaut和Kotlin,使用gRPC进行一个项目,我遇到了一些我似乎找不到答案的问题。

我正在使用 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")
}

共有1个答案

孙弘博
2023-03-14

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

 类似资料:
  • 我试图使用注释和ConstraintValidator接口创建自定义bean验证。目的是使模型的名称独一无二。我不知道为什么,但是当我提交表单以便添加产品时,会抛出NullPointerException。 我的root-context.xml文件:

  • 问题内容: 我正在使用Spring MVC创建一个网站,并且为了持久性,我将Spring Data JPA与Hibernate 4用作我的JPA提供程序。目前正在使用Hibernate Validator处理验证。我有一个问题,我的验证程序被两次调用,我不知道为什么。这是一个问题的主要原因是因为第二轮未将依赖项自动关联到验证器中,并且出现了空指针异常。以下是导致失败的调用顺序: 提交注册表,然后首

  • null 有人能解释为什么要调用验证器两次,特别是为什么要跳过“userrepository.save(user);”回到这些验证器里? 多谢 下面是我的user.java类 我的用户存储库: 最后,我的persistence-context.xml文件

  • 为了描述Gradle构建脚本,我们可以通过< code>build.gradle.kts文件使用Kotlin。在< code>dependencies和build 部分全局定义要使用的Kotlin版本是一个常见的问题(在给定的情况下使用不同的版本是相当罕见的)。 请考虑以下代码 (Gradle 4.3.1): 如您所见,kotlin(在本例中为1.2.30)定义了两次:和,它们通常没有区别。由于D

  • 我遇到了spring和kotlin的问题: 这是: 我有一个类MyConfig定义为 另一方面,我定义了另一个类MyService 但我得到的只是以下信息: 此问题仅发生在@Configuration类中定义的bean(用@Bean注释),而不是声明为@Component或@Service的bean。 对于纯Java中的同类体系结构,我没有这样的问题。 我使用spring boot 2.0.1 那

  • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?