Как зарегистрировать внешнюю аннотацию для использования при весенней проверке - PullRequest
2 голосов
/ 16 января 2020

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


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

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

@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
    }

}

Я не могу заставить пружину использовать мой UniqueLoginValidator для проверки полей, помеченных UniqueValue в моем запросе. Есть идеи как их склеить? Я не могу использовать @ Constraint (validatedBy = [UniqueValueValidator :: class]) , поскольку он не доступен во внешней библиотеке.

Ответы [ 3 ]

0 голосов
/ 20 января 2020

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

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

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

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

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

0 голосов
/ 22 января 2020

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

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

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

0 голосов
/ 20 января 2020

Полагаю, вам нужно добавить @Constraint к вашему классу аннотаций:

@Constraint(validatedBy = UniqueValueValidator.class)

И все остальное должно быть в порядке.

...