註解

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 回答 所述。