Skip to content

Coding Tips

Field Annotations

在 Kotlin 中对同一个属性使用多个注解,有两种常见写法:

1) 逐个写(最直观)

data class SyncDTO(
    @field:NotBlank
    @field:Size(max = 64)
    var stable: String,

    @field:NotNull
    @field:PastOrPresent
    var startTime: Date,

    @field:NotNull
    @field:FutureOrPresent
    var endTime: Date
)

2) 同一使用位置用"方括号聚合"

  • 当多个注解都贴在同一个使用位置(如都贴到 field)时,可以用方括号一次性写
data class SyncDTO(
    @field:[NotBlank Size(max = 64)]
    var stable: String,

    @field:[NotNull PastOrPresent]
    var startTime: Date,

    @field:[NotNull FutureOrPresent]
    var endTime: Date
)

混合不同使用位置

如果不同注解需要贴到不同的位置(比如有的要贴 field,有的要贴 get),就分别指明:

1
2
3
4
5
data class User(
    @field:[NotBlank Size(max = 32)]
    @get:Schema(description = "用户名")
    val name: String
)
  • 上面 NotBlank、Size 贴在字段;Schema 贴在 getter。

校验分组与嵌套校验

分组

1
2
3
4
5
6
7
8
interface Create
interface Update

data class Dto(
    @field:NotBlank(groups = [Create::class])
    @field:Size(max = 64, groups = [Create::class, Update::class])
    val code: String
)

嵌套对象列表校验

1
2
3
4
5
6
7
8
9
import jakarta.validation.Valid
import jakarta.validation.constraints.*

data class Order(
    @field:NotNull
    @field:Size(min = 1)
    @field:Valid // 确保嵌套对象也会被校验
    val items: List<OrderItem>
)