注解

Spring Framework 还利用了 Kotlin 空安全 来判断 HTTP 参数是否是必需的,而无需显式 定义 required 属性。这意味着 @RequestParam name: String? 被视为 非必需的,反之,@RequestParam name: String 被视为必需的。 此功能也支持 Spring Messaging 的 @Header 注解。

类似地,使用 @Autowired@Bean@Inject 进行的 Spring bean 注入 会利用此信息来判断 bean 是否是必需的。

例如,@Autowired lateinit var thing: Thing 意味着一个 Thing 类型的 bean 必须在应用程序上下文中注册,而 @Autowired lateinit var thing: Thing? 在这种 bean 不存在时不会引发错误。

遵循相同的原则,@Bean fun play(toy: Toy, car: Car?) = Baz(toy, car) 意味着 一个 Toy 类型的 bean 必须在应用程序上下文中注册,而 Car 类型的 bean 可能存在也可能不存在。相同的行为适用于自动装配的构造函数参数。

如果您在带有属性的类或带有参数的主构造函数上使用 bean 验证, 您可能需要使用 注解使用站点目标, 例如 @field:NotNull@get:Size(min=5, max=15),如 此 Stack Overflow 回答 中所述。