You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 00:27:50