Spring Boot 3.3.x中集合元素的Jakarta Bean Validation校验不生效求助
Spring Boot 3.3.x中集合元素的Jakarta Bean Validation校验不生效求助
嗨,我刚踩过这个一模一样的坑!在Spring Boot 3.3.x搭配Hibernate Validator 8.x的时候,集合里的元素死活触发不了@NotNull校验,折腾了好一会儿才搞清楚问题出在哪,跟你分享下解决思路和方案:
问题根源:手动创建的Validator缺了Spring Boot的默认配置
你代码里是自己通过Validation.buildDefaultValidatorFactory().validator创建的校验器,但Spring Boot其实会自动配置一个LocalValidatorFactoryBean——它已经帮我们开启了泛型类型参数约束的支持,还整合了Spring上下文的相关配置。手动创建的校验器没加载这些关键配置,导致泛型参数上的@NotNull约束根本没被解析到。最快的解决办法:改用Spring容器注入的Validator
把测试类改成依赖注入的方式获取Validator,别再自己手动new了。调整后的代码如下:import jakarta.validation.Valid import jakarta.validation.Validator import jakarta.validation.constraints.NotNull import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest @SpringBootTest class Test1 { @Autowired private lateinit var validator: Validator @Test fun test() { val request = TestList(listOf(null)) val violations = validator.validate(request) assertThat(violations).isNotEmpty // 现在这个断言应该能正常通过了 } data class TestList( @field:Valid val values: List<@NotNull String?>? ) }如果必须手动创建Validator的配置方案
要是你因为某些特殊场景不能用Spring注入的实例,那手动构建的时候,得明确指定用Hibernate Validator的Provider来配置,确保类型参数约束能生效:import org.hibernate.validator.HibernateValidator private val validator = Validation.byProvider(HibernateValidator::class.java) .configure() // 这里可以根据需求加额外配置,比如是否开启快速失败模式 .failFast(false) .buildValidatorFactory() .validator额外要注意的小细节
- 你代码里
List<@NotNull String?>的写法是对的,@NotNull确实要标注在泛型参数上,这是Jakarta Bean Validation 3.0+支持的类型参数约束写法。 - Kotlin的data class字段上,
@field:Valid的注解定位没毛病,它能确保校验器识别到需要对集合进行嵌套校验,遍历每个元素做检查。
- 你代码里
内容来源于stack exchange
相关产品推荐
相关产品推荐

