Micronaut中数据类校验失效问题求助
问题排查与解决方案
1. 嵌套对象需加@Valid触发递归校验
你的RequestTO里的items是嵌套的ItemsTO列表,JSR-380校验规范默认不会自动递归校验嵌套对象/集合,必须给items字段加上@Valid注解才会触发内部字段的校验:
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) data class RequestTO( @field:Valid val items: List<ItemsTO> )
2. 确保依赖Jar中的数据类生成了内省元数据
Micronaut的校验依赖编译时生成的内省元数据,如果你引入的是其他项目打包的Jar,得做以下检查:
- 依赖项目的
build.gradle必须配置Micronaut的注解处理器:kapt "io.micronaut:micronaut-inject-java" kapt "io.micronaut:micronaut-validation" - 依赖项目的
ItemsTO和RequestTO必须添加@Introspected注解:@Introspected @JsonInclude(JsonInclude.Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) data class ItemsTO( @field:Min(value = 1, message = "Minimum quantity has to be 1") val quantity: Int ) @Introspected @JsonInclude(JsonInclude.Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) data class RequestTO( @field:Valid val items: List<ItemsTO> )
如果没法修改依赖项目,就在当前项目里新增一个配置类,手动指定要内省的依赖类:
@Introspected(classes = [ItemsTO::class, RequestTO::class]) @Configuration class ValidationConfig
这样当前项目编译时会为Jar里的类生成所需的内省元数据。
3. 校验当前项目的配置是否到位
- 控制器类必须加
@Validated注解,这是触发类级别校验的必要条件:@Validated @Controller("/your-api-path") class YourController { @Post("/") @Status(HttpStatus.CREATED) fun handleRequest(@Valid @Body requestTO: RequestTO): ResponseTO {} } - 检查
application.yml/application.properties,确保没禁用校验:
确认不存在以下配置:micronaut: validation: enabled: false
4. 检查版本兼容性
Micronaut 3.4.2官方推荐的Kotlin版本是1.6.x,你用的1.7.22可能存在兼容性问题。可以尝试降级Kotlin到1.6.21,或者升级Micronaut到3.9及以上版本(该版本开始支持Kotlin 1.7)。
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

