注解

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

类似地,Spring bean注入使用@Autowired@Bean@Inject时,也会利用这些信息来确定一个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回答中所述。