Как объединить несколько аннотаций в один в Котлине? - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь проверить RequestBody, используя мои пользовательские аннотации.

С настройкой ниже моя проверка работает:

data class PlayerRegistration(
    @field: Email
    val email: String,
    @field: Pattern(regexp = NICK_REGEX)
    @field: Size(min = 5, max = 15)
    val nick: String,
    @field: Pattern(regexp = PASSWORD_REGEX)
    @field: Size(min = 8, max = 20)
    val password: String,
    val birthDate: LocalDate
)

Но когда я пытаюсь подытожить аннотации вот так:

data class PlayerRegistration(
    @field: Email
    val email: String,
    @field: ValidNick
    val nick: String,
    @field: ValidPassword
    val password: String,
    val birthDate: LocalDate
)

@Pattern(regexp = NICK_REGEX)
@Size(min = 5, max = 15)
@Target(AnnotationTarget.FIELD)
private annotation class ValidNick

@Pattern(regexp = EMAIL_REGEX)
@Size(min = 8, max = 20)
@Target(AnnotationTarget.FIELD)
private annotation class ValidPassword

Это не работает. Что я делаю не так?

1 Ответ

0 голосов
/ 16 апреля 2019

Вкратце: ваш подход создает аннотации с аннотациями - два уровня вложенности.Это не механизм группировки аннотаций.

Попробуйте думать как процессор аннотаций.В первом фрагменте кода процессор видит поле nick и думает: «Хорошо, я знаю, как применить Pattern и Size к полю».

Во втором фрагменте кода дляполе nick видит ValidNick и думает: «Я не знаю аннотации такого типа, и я не знаю, как рассматривать это как ограничение поля».Процессор должен знать, что он должен перейти к аннотациям этой аннотации, и это - я считаю - не поддерживается "из коробки".

На вашем месте я бы не стал продвигаться к такой структуре кода,IMO это уменьшает читабельность, потому что для того, чтобы узнать ограничения Ника, вам нужно перейти к какой-то другой части кода.Теоретически это можно использовать повторно, но вопрос в том, сколько повторных использований у вас будет?

Если вы действительно хотите добиться чего-то похожего, вместо аннотаций, я бы дал делегированные свойства попыткаОни позволяют вам перехватывать сеттер и сохранять такую ​​логику перехвата как класс многократного использования

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...