Как зарегистрировать внешнюю аннотацию для использования при весенней проверке
У меня есть библиотека, в которой определены некоторые аннотации. Эту аннотацию можно добавить к моим запросам, я бы хотел приклеить эту аннотацию к какому-нибудь настраиваемому валидатору.
Внешняя библиотека
Класс аннотации
@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)
отображение.
Вот несколько "указаний" к решениям, которые могут работать, но я сомневаюсь, что вы захотите их использовать:
Как я уже сказал, вы можете изменить код валидатора спящего режима и самостоятельно предоставить логику сопоставления. Что-то вроде файла "свойств" (или чего-то еще), который будет содержать сопоставление аннотации с фактическим валидатором, который вам все равно придется реализовать в своем коде.
Измените байт-код аннотации, когда она загружена загрузчиком классов в среде выполнения. Измененный байт-код будет включать это
@Constraint
мета-аннотация.