注释
Spring框架还利用Kotlin的null安全机制来判断某个HTTP参数是否为必填项,而无需显式定义required属性。这意味着@RequestParam name: String?被视为非必填,反之@RequestParam name: String则被视为必填。这一特性在Spring Messaging的@Header注解中同样得到支持。
同样地,使用@Autowired、@Bean或@Inject进行Springbean注入时,也会利用这些信息来判断某个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回答中所描述的。