如何在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>? )
关键说明
- 类型注解的使用:
@Size(min = 10)直接放在泛型参数String的前面,这会告诉Spring校验器,要对Optional容器内部的字符串进行长度校验,而不是校验Optional对象本身。 - 区分两种null场景:
- 当请求体是
{}时,title参数会被解析为null(对应Java代码中的@Nullable Optional<...>) - 当请求体是
{"title": null}时,title会被解析为一个存在但内部值为null的Optional实例
- 当请求体是
- 校验触发逻辑:只有当
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
相关产品推荐
相关产品推荐

