spring - 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 支持问题。
解决方案
推荐阅读
- github - 我可以在 Github 上使用 https 调用访问 Private Repository RAW 文件吗?
- tvos - Superpowered可以用来输出5.1或7.1环绕声吗?
- android - Android ActivityManager 中的 `act` 和 `cat` 是什么意思?
- java - 删除空字符串并减少相同的 String[][] 数组
- hive - 计算 hive 中的行百分比
- git - 试图在 repo 中更新一些提交作者,但说由 X 编写,由 Y 提交
- reactjs - 如何使用 jest 在回调中获取代码覆盖率?
- javascript - 使用 jQuery 创建一个“实时”倒数计时器
- php - 如何从数据库和多个文件夹中删除文件
- javascript - 预期的实例道具与 React 16 中的记忆道具匹配