注解

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

类似地,Spring 使用 @Autowired@Bean@Inject 进行 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 校验,您可能需要使用 注解的 use-site targets,例如 @field:NotNull@get:Size(min=5, max=15),如 这篇 Stack Overflow 回答 所述。