@Target(AnnotationTarget.CLASS) @Retention(AnnotationRetention.SOURCE) annotation class Validated @Validated class User(val name:String,val age:Int) { init { if(name.isEmpty()){ throw IllegalArgumentException("Name must not be empty") } if(age<=0){ throw IllegalArgumentException("Age must be greater than zero") } } } fun main() { val user=User("",-1) }这段代码的注解在编译期间为何没有生效,请问如何修改?
时间: 2023-11-22 22:54:35 浏览: 122
详解JDK 5 Annotation 注解之@Target的用法介绍
这段代码中的 `@Validated` 注解是你自己定义的注解,并不是 Spring 中的 `@Validated` 注解。因此,在编译期间并不会对 `User` 类中的属性进行校验。
如果你想要实现类似的校验功能,可以使用 Spring 中的 `@Validated` 注解,配合 `javax.validation.constraints` 中的注解来完成。
示例代码:
```kotlin
import javax.validation.constraints.NotEmpty
import javax.validation.constraints.Positive
data class User(
@field:NotEmpty(message = "Name must not be empty") val name: String,
@field:Positive(message = "Age must be greater than zero") val age: Int
)
fun main() {
val user = User("", -1)
}
```
这里使用了 `@field` 来标记注解应该放在属性上而不是 getter 方法上,同时使用了 `@NotEmpty` 和 `@Positive` 注解对属性进行校验。在运行时,如果校验失败,将会抛出 `javax.validation.ConstraintViolationException` 异常。如果需要在编译期间进行校验,可以使用 `kotlin-compiler-plugin` 等工具来实现。
阅读全文