我正在尝试使用自定义注释来验证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
它不起作用。我在做什么错了?
答案 0 :(得分:0)
简而言之:您的方法将创建具有注释的注释-两层嵌套。这不是对注释进行分组的机制。
尝试像注释处理器一样思考。在第一个代码段中,处理器看到一个字段nick
并认为“好,我知道如何将Pattern
和Size
应用于一个字段”。
在第二个代码段中,对于字段nick
,它看到ValidNick
并认为:“我不知道这种类型的注释,也不知道如何将其视为字段约束”。处理器将必须知道必须转到该批注的批注,而且-我认为-尚不支持即开即用。
如果我是你,我不会推动这种代码结构。 IMO会降低可读性,因为为了知道nick的约束,您必须转到代码的其他部分。从理论上讲,它是可重用的,但问题是:您将有多少次重用?
如果您真的想实现类似的目的,而不是使用注释,请尝试delegated properties。他们让您拦截设置器,并将拦截逻辑保留为可重用的类