如何在 Kotlin 中将多个注释合并为一个?



我正在尝试使用我的自定义注释来验证 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

它不起作用。我做错了什么?

简而言之:您的方法创建具有注释的注释 - 两个嵌套级别。它不是对批注进行分组的机制。

尝试像注释处理器一样思考。在第一个代码片段中,处理器看到一个nick字段,并认为"好的,我知道如何将PatternSize应用于字段"。

在第二个代码片段中,对于字段nick,它看到ValidNick并认为"我不知道这种类型的注释,我不知道如何将其视为字段约束"。处理器必须知道它必须转到此注释的注释,而我相信这是开箱即用的不支持的。

如果我是你,我不会推动这样的代码结构。IMO 它降低了可读性,因为为了了解 nick 的约束,您必须转到代码的其他部分。从理论上讲,它是可重用的,但问题是:你会有多少重用?

如果您真的想实现类似的东西,而不是注释,我会尝试委托属性。它们允许您拦截 setter,并将此类拦截逻辑保留为可重用类

相关内容

最新更新