Kotlin 中的 Javax 验证自定义枚举约束
Javax Validation Custom enum constrains in Kotlin
我正在尝试创建自定义注释和验证器以与 javax validation Api
结合使用,但我无法访问枚举的值。
注解的 objective 和验证器在枚举值中存在输入数据时进行验证。
这是注释class
import javax.validation.Constraint
import javax.validation.Payload
import kotlin.reflect.KClass
@kotlin.annotation.Target(
AnnotationTarget.FIELD,
)
@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
@MustBeDocumented
@Constraint(validatedBy = [ValueOfEnumValidator::class])
annotation class ValueOfEnum(
val enumClass: KClass<Enum<*>>,
val message: String ="",
val groups: Array<KClass<*>> = [],
val payload: Array<KClass<out Payload>> = []
)
这是验证器实现
import javax.validation.ConstraintValidator
import javax.validation.ConstraintValidatorContext
class ValueOfEnumValidator: ConstraintValidator<ValueOfEnum, CharSequence> {
private val acceptedValues: MutableList<String> = mutableListOf()
override fun initialize(constraintAnnotation: ValueOfEnum) {
super.initialize(constraintAnnotation)
acceptedValues.addAll(constraintAnnotation.enumClass.java
.enumConstants
.map {it.name}
)
}
override fun isValid(value: CharSequence?, context: ConstraintValidatorContext): Boolean {
return if (value == null) {
true
} else acceptedValues.contains(value.toString())
}
}
我打算像这样使用注释:
@field:ValueOfEnum(enumClass = SortDirectionEnum::class, message = "{variants.sorted.sort.direction.not.valid}")
var sortDirection:String?=
但是我的 IDE 报告我在 enumClass 参数中出现以下错误
Type mismatch.
Required:KClass<Enum<*>>
Found:KClass<SortDirectionEnum>
如何使注释足够通用以支持不同的枚举,并解决此问题?
您将 enumClass 限制为 Enum<*> 的实例,允许 Enum 实例(尽管 Enum 是一个抽象 class,所以什么都不能使用)与所有类型的数据,但是您还希望允许Enum 的子 classes,可以通过那里的 out 关键字实现。
val enumClass: KClass<out Enum<*>>,
我正在尝试创建自定义注释和验证器以与 javax validation Api
结合使用,但我无法访问枚举的值。
注解的 objective 和验证器在枚举值中存在输入数据时进行验证。
这是注释class
import javax.validation.Constraint
import javax.validation.Payload
import kotlin.reflect.KClass
@kotlin.annotation.Target(
AnnotationTarget.FIELD,
)
@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
@MustBeDocumented
@Constraint(validatedBy = [ValueOfEnumValidator::class])
annotation class ValueOfEnum(
val enumClass: KClass<Enum<*>>,
val message: String ="",
val groups: Array<KClass<*>> = [],
val payload: Array<KClass<out Payload>> = []
)
这是验证器实现
import javax.validation.ConstraintValidator
import javax.validation.ConstraintValidatorContext
class ValueOfEnumValidator: ConstraintValidator<ValueOfEnum, CharSequence> {
private val acceptedValues: MutableList<String> = mutableListOf()
override fun initialize(constraintAnnotation: ValueOfEnum) {
super.initialize(constraintAnnotation)
acceptedValues.addAll(constraintAnnotation.enumClass.java
.enumConstants
.map {it.name}
)
}
override fun isValid(value: CharSequence?, context: ConstraintValidatorContext): Boolean {
return if (value == null) {
true
} else acceptedValues.contains(value.toString())
}
}
我打算像这样使用注释:
@field:ValueOfEnum(enumClass = SortDirectionEnum::class, message = "{variants.sorted.sort.direction.not.valid}")
var sortDirection:String?=
但是我的 IDE 报告我在 enumClass 参数中出现以下错误
Type mismatch.
Required:KClass<Enum<*>>
Found:KClass<SortDirectionEnum>
如何使注释足够通用以支持不同的枚举,并解决此问题?
您将 enumClass 限制为 Enum<*> 的实例,允许 Enum 实例(尽管 Enum 是一个抽象 class,所以什么都不能使用)与所有类型的数据,但是您还希望允许Enum 的子 classes,可以通过那里的 out 关键字实现。
val enumClass: KClass<out Enum<*>>,