首页 > 解决方案 > Spring:ConstraintValidator 似乎没有触发

问题描述

我编写了一个自定义验证器,它将根据它映射到的弹性搜索文档 POJO 的字段值检查 json 属性的值。例如:

{
    "detail": "fullName"
    "values": ["Stack Overflow"]
    "active": "false"
}
data class DetailsDocument(
    val fullName: String,
    val address: String,
    val phoneNumber: String,
    val emailAddress: String
)

所以如果 JSON 喜欢:

{
    "detail": "maritalStatus",
    "values":["married"],
    "active": "true"
}

进来,它会验证失败,因为maritalStatus它不是DetailsDocument.

我的验证器注释和实现类如下所示:

import javax.validation.Constraint
import javax.validation.ConstraintValidator
import javax.validation.ConstraintValidatorContext
import javax.validation.ReportAsSingleViolation
import javax.validation.constraints.NotNull
import kotlin.reflect.KClass
import kotlin.reflect.full.declaredMemberProperties

@Constraint(validatedBy = [DetailsFieldValidatorImpl::class])
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FIELD)
@NotNull(message = "Value cannot be null")
@ReportAsSingleViolation
annotation class DetailsFieldValidator(val sourceClass: KClass<*>, val message: String = "Value is not valid")

class DetailsFieldValidatorImpl : ConstraintValidator<DetailsFieldValidator, String> {

    private var valueList: List<String>? = null

    override fun isValid(value: String?, context: ConstraintValidatorContext?): Boolean {
        return valueList?.contains(value?.toUpperCase()) ?: false
    }

    override fun initialize(constraintAnnotation: DetailsFieldValidator) {
        valueList = constraintAnnotation.sourceClass.declaredMemberProperties.map { it.toString().toUpperCase() }
    }
}

我的用法是:

data class Account(

    @DetailsFieldValidator(sourceClass = DetailsDocument::class)
    val name: String,
    val values: List<String>,
    val active: Boolean
)

但是,当我发送无效的 json 时,验证器似乎不会启动并拒绝该块。我的请求继续执行并在预期点失败,给出无效值。

我是否错过了将我的验证器添加到某种注册表之类的东西?也许缺少依赖项?我试过添加:

implementation("javax.annotation:javax.annotation-api")
implementation("org.springframework.boot:spring-boot-starter-validation")

但没有任何改变。

我发现的一个非常重要的注意事项;我在这里阅读了其中一个答案,即 Spring 无法识别 Kotlin 中的注释,但无法找到任何支持这一点的文档。

SpringBoot: v2.3.0.RELEASE
Kotlin: v1.3.72

编辑

我已经尝试添加一个 Java 实现,但仍然是同样的问题,所以相当有信心这不是 Kotlin 支持问题。

标签: springspring-bootkotlinspring-annotationsspring-validator

解决方案


推荐阅读