Как зарегистрировать внешнюю аннотацию для использования при весенней проверке

У меня есть библиотека, в которой определены некоторые аннотации. Эту аннотацию можно добавить к моим запросам, я бы хотел приклеить эту аннотацию к какому-нибудь настраиваемому валидатору.


Внешняя библиотека

Класс аннотации

@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]), поскольку он недоступен во внешней библиотеке.

3 ответа

Вы можете создать новую аннотацию, расширяющую аннотацию из библиотеки, и аннотировать ее с помощью ограничения проверки.

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

Это означает, что вам придется использовать эту недавно созданную аннотацию вместо аннотации из библиотеки.

Я считаю, что вам нужно добавить @Constraint в ваш класс аннотации:

@Constraint(validatedBy = UniqueValueValidator.class)

А в остальном все должно быть хорошо.

Нет необходимости определять валидатор как компонент. В текущей реализации валидатора спящего режима, который должен стоять за средством проверки Spring, он не будет предоставлять никакого значения.

Плохая новость заключается в том, что кажется, что без расширения валидатора гибернации для обеспечения логики сопоставления между аннотацией и настраиваемым валидатором нет способа добиться того, что вы хотите, если предположить, что аннотации находятся во внешней библиотеке, и вы не можете ее изменить. путем предоставления @Constraint(validatedBy) отображение.

Вот несколько "указаний" к решениям, которые могут работать, но я сомневаюсь, что вы захотите их использовать:

  1. Как я уже сказал, вы можете изменить код валидатора спящего режима и самостоятельно предоставить логику сопоставления. Что-то вроде файла "свойств" (или чего-то еще), который будет содержать сопоставление аннотации с фактическим валидатором, который вам все равно придется реализовать в своем коде.

  2. Измените байт-код аннотации, когда она загружена загрузчиком классов в среде выполнения. Измененный байт-код будет включать это@Constraint мета-аннотация.

Другие вопросы по тегам