2

我有一个定义一些注释的库。这个注释可以添加到我的请求中,我想将该注释粘贴到一些自定义验证器上。


外部库

注释类

@Target(
    AnnotationTarget.FUNCTION,
    AnnotationTarget.PROPERTY_GETTER,
    AnnotationTarget.PROPERTY_SETTER,
    AnnotationTarget.FIELD
)
@Retention(AnnotationRetention.RUNTIME)
annotation class UniqueValue()

请求类

class PostReq(
    @field:UniqueValue
    val value: String
)

我的应用

@Component
class UniqueValueValidator() : ConstraintValidator<UniqueValue?, String?> {

    override fun initialize(constraint: UniqueValue?) {}

    override fun isValid(value: String?, context: ConstraintValidatorContext): Boolean {
        println("validation magic")
        return true
    }

}

我无法让 spring 使用我的UniqueLoginValidator来验证我的请求中使用UniqueValue注释的字段。关于如何将它们粘合在一起的任何想法?我不能使用@Constraint(validatedBy = [UniqueValueValidator::class])因为它在外部库中不可用。

4

3 回答 3

0

您可以创建一个新的注释来扩展库中的注释,并使用验证约束对该注释进行注释。

@UniqueValue
@Constraint(validatedBy = UniqueValueValidator.class)
public @interface ValidatedUniqueValue {
}

这意味着您将不得不使用这个新创建的注释而不是库中的注释。

于 2020-01-22T17:22:49.397 回答
0

我相信您需要添加@Constraint到您的注释类:

@Constraint(validatedBy = UniqueValueValidator.class)

其余的应该没问题。

于 2020-01-20T06:57:36.210 回答
0

无需将验证器定义为组件。在应该站在弹簧验证设施后面的休眠验证器的当前实现中,它不会提供任何值。

现在,坏消息是,如果不扩展休眠验证器以提供注释和自定义验证器之间的映射逻辑,则似乎无法实现您想要的,假设注释在外部库中并且您无法修改它通过提供@Constraint(validatedBy)映射。

以下是一些可行的解决方案的“方向”,但我怀疑您是否想使用:

  1. 正如我所说,您可以更改休眠验证器的代码并自己提供映射逻辑。类似于“属性”(或其他)文件的东西,它将包含注释到实际验证器的映射,无论如何您都必须在代码中实现。

  2. 在运行时由类加载器加载注释时更改注释的字节码。更改后的字节码将包含此@Constraint元注释。

于 2020-01-20T07:12:08.103 回答