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