Пользовательская проверка Micronaut Аннотация не работает

Я пытался написать пользовательскую аннотацию для проверки поля в проекте Micronaut, я наткнулся на этот раздел в их документации Определение дополнительных ограничений

Насколько я понимаю, вполне возможно написать свою собственную аннотацию для проверки поля в моем POJO, но после нескольких часов попыток я не могу заставить свою проверку работать, она просто не вызывается, может быть, я что-то упустил основные сведения о том, как работает Micronaut?

Аннотация

@Retention(RUNTIME)
@Constraint(validatedBy = [])
annotation class FieldValidator(
    val message: String = "invalid format ({validatedValue})"
)

Фабрика

@Factory
class ValidatorFactory {

    @Singleton
    fun fieldPatternValidator(): ConstraintValidator<FieldValidator, CharSequence> {
        return ConstraintValidator { value, annotation, context ->
            context.messageTemplate("invalid format ({validatedValue}), should be test") 
            value == "test"
        }
    }
}

Фильтр

@Introspected
data class HelloWorldFilter(
    @FieldValidator
    val field: String?
)

Контроллер

@Controller("/hello")
open class HelloController() {

    @Get("{?filters*}")
    @Produces(MediaType.TEXT_PLAIN)
    open fun index(@Valid filters: HelloWorldFilter): String {
        return filters.toString()
    }
}

У меня есть небольшая демка на Github, чтобы воспроизвести

  1. беги ./gradlew run

  2. вызовите http://localhost:8080/hello?field=abc, что ожидаемое поведение должно быть неверным запросом, поскольку поле соответствует желаемому значению.

Поскольку в вашей демонстрации нет ни теста, ни шагов для воспроизведения проблемы. Единственное, что выделяется, это: @FieldValidator val field: String? обычно с Kotlin это @field:FieldValidator.

ShingJo 15.12.2022 22:42

Извините, вы правы, я забыл добавить шаг, в основном это запуск службы и вызов конечной точки hello world, я добавлю шаги завтра!

Eric Nascimento 15.12.2022 23:10

@ShingJo Я пробовал, это уже не проблема.

Eric Nascimento 16.12.2022 11:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используя ваш демонстрационный проект, я изменил ваш класс HelloWorldFilter на

@Introspected
data class HelloWorldFilter(
    @field:FieldValidator
    val field: String?
)

Запустил, затем:

curl "http://localhost:8080/hello?field=abc"

Вывод был таким, как вы ожидаете:

{"message":"Bad Request","_embedded":{"errors":[{"message":"filters.field: invalid format (abc), should be test"}]},"_links":{"self":{"href":"/hello?field=abc","templated":false}}}

С:

curl "http://localhost:8080/hello?field=test"

Выход:

HelloWorldFilter(field=test)

Интересно, это работало, я думаю, что версия, которая у меня была запущена локально, не имела @Valid (я, вероятно, удалил его, потому что думал, что это не нужно), вы правы, похоже @field:FieldValidator Я буду читать о том, почему мне нужно его объявить например, @NotNull отлично работает, спасибо!

Eric Nascimento 16.12.2022 17:36

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