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

GET请求中复杂对象参数校验失效问题求助

解决GET请求复杂参数的校验问题

可以对GET请求的复杂参数做校验,你的问题主要出在Kotlin注解的作用目标以及参数绑定的配置上,下面是具体的解决步骤和修正后的代码:

1. 修正FilterDTO的校验注解

Kotlin的data class属性默认会生成getter/setter,校验注解如果不加@field:前缀,会被应用到getter方法上,而Spring的校验机制需要字段级别的注解才能生效。所以要给校验注解加上@field:前缀:

data class FilterDTO(
    @field:NotNull(message = "id不能为空")
    val id: Long? = null,
    @field:NotNull(message = "code不能为空")
    val code: String? = null
)

注:这里的@Valid是用于嵌套对象校验的,当前DTO没有嵌套子对象,所以不需要添加。

2. 修正控制器的参数配置

GET请求的复杂对象参数需要通过@ModelAttribute(Spring MVC会默认绑定,但显式声明更清晰)配合@Valid来触发校验,同时单个参数的@Valid可以去掉(@NotNull已经足够):

@Validated
@RestController
@RequestMapping("/foo")
class FooController {
    @GetMapping
    fun get(
        @Valid @ModelAttribute filter: FilterDTO,
        @NotNull @RequestParam("bar") bar: String?
    ) {
        // 业务逻辑
    }
}

3. 确保校验依赖存在

如果是Spring Boot 2.3及以上版本,spring-boot-starter-validation不会被自动引入,需要在构建文件中手动添加依赖:

Gradle

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-validation")
}

Maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

关键说明

  • @Validated作用在控制器类上,是用来触发单个请求参数(比如@RequestParam)的校验;而复杂对象的校验需要在参数上添加@Valid。
  • 请求时要确保参数名和DTO的属性名完全匹配,比如请求URL应为/foo?id=123&code=test&bar=demo。
  • 如果DTO中有嵌套的复杂对象,需要在嵌套属性上添加@field:Valid来触发嵌套校验。

内容的提问来源于stack exchange,提问作者João Menighin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:50:26