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<*>>,

https://kotlinlang.org/docs/generics.html