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
相关产品推荐
相关产品推荐

