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

如何在Kotlin中为Optional内的类型参数添加注解以实现Spring Boot参数校验?

在Kotlin中为Optional内部的String类型添加校验注解

要实现你想要的效果——对Optional内部的String而非Optional本身应用@Size校验,同时区分{"title": null}和{}两种请求场景,你需要在Kotlin中使用类型注解来标注泛型参数的类型,而不是注解整个字段。

正确的代码实现

import javax.validation.constraints.Size
import java.util.Optional
import com.fasterxml.jackson.annotation.JsonProperty

class Post(
    @field:JsonProperty("title")
    val title: Optional<@Size(min = 10) String>?
)

关键说明

  1. 类型注解的使用:@Size(min = 10)直接放在泛型参数String的前面,这会告诉Spring校验器,要对Optional容器内部的字符串进行长度校验,而不是校验Optional对象本身。
  2. 区分两种null场景:
    • 当请求体是{}时,title参数会被解析为null(对应Java代码中的@Nullable Optional<...>)
    • 当请求体是{"title": null}时,title会被解析为一个存在但内部值为null的Optional实例
  3. 校验触发逻辑:只有当title非null(即请求中存在title字段)且内部的String也非null时,@Size(min=10)才会触发校验;如果内部字符串是null,该注解不会生效(这符合@Size的默认行为)。

补充配置与注意事项

  • 确保你的项目引入了spring-boot-starter-validation依赖,这样Spring的校验机制才能正常工作。
  • 在接收请求的控制器方法上,记得给@RequestBody参数加上@Valid注解,触发校验:
    @RestController
    class PostController {
        @PostMapping("/posts")
        fun createPost(@Valid @RequestBody post: Post): ResponseEntity<Post> {
            // 处理你的业务逻辑
            return ResponseEntity.ok(post)
        }
    }
    
  • 如果你还想限制内部的String不能为null,可以叠加@NotNull注解:
    val title: Optional<@NotNull @Size(min = 10) String>?
    

为什么你的原代码无效

你之前的代码@field:Size(min = 10) val title: Optional<String>?是把@Size注解应用在整个Optional<String>?字段上,校验器会尝试对Optional对象执行长度校验——这显然不符合预期,因为@Size是专门针对字符串类型的注解。

内容的提问来源于stack exchange,提问作者André Lima

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:24:08