Spring Boot Kotlin环境下泛型容器的Javax Validation问题:列表元素校验失效如何解决
解决Kotlin中Spring Boot集合元素校验失效的问题
这个问题确实是Kotlin注解处理和Java的差异导致的——在Java中List<@Valid T>能直接生效,但Kotlin中需要显式指定注解的使用站点目标,才能让Bean Validation识别泛型参数上的@Valid。
问题根源
Kotlin中,当你在构造函数参数(同时作为类字段)上声明泛型集合时,默认情况下泛型参数上的@Valid注解会被绑定到构造函数参数的泛型,而不是类字段的泛型。Spring Validation在校验时,主要识别的是字段或getter上的注解,所以导致集合元素的校验规则无法被触发。
解决方案
你需要给泛型参数上的@Valid显式指定使用站点目标为@field:(对应类字段),或者@param:(对应构造函数参数),确保Spring能正确识别到集合元素的校验规则。
修改后的MyContainer类代码如下:
class MyContainer<T>( @field:Valid @field:NotEmpty(message = "The list of objects can not be null or empty") var objects: List<@field:Valid T>? = listOf(), )
或者如果你倾向于使用构造函数参数注解(和你之前尝试的@param:对应),可以写成:
class MyContainer<T>( @param:Valid @param:NotEmpty(message = "The list of objects can not be null or empty") var objects: List<@param:Valid T>? = listOf(), )
验证效果
修改后,当你发送包含空value的CreateRequest元素的请求体时,比如:
{ "objects": [ {"value": null} ] }
Spring会正确触发CreateRequest中@NotNull的校验规则,返回对应的错误提示。
另外,注意你的MyContainer中objects的默认值是listOf()(空列表),这会导致当请求体中不包含objects字段时,触发@NotEmpty的校验错误,这和你预期的行为一致,无需修改。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

