我正在尝试使用我的自定义注释来验证 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
字段,并认为"好的,我知道如何将Pattern
和Size
应用于字段"。
在第二个代码片段中,对于字段nick
,它看到ValidNick
并认为"我不知道这种类型的注释,我不知道如何将其视为字段约束"。处理器必须知道它必须转到此注释的注释,而我相信这是开箱即用的不支持的。
如果我是你,我不会推动这样的代码结构。IMO 它降低了可读性,因为为了了解 nick 的约束,您必须转到代码的其他部分。从理论上讲,它是可重用的,但问题是:你会有多少重用?
如果您真的想实现类似的东西,而不是注释,我会尝试委托属性。它们允许您拦截 setter,并将此类拦截逻辑保留为可重用类