对于最新的稳定版本,请使用 Spring Data Commons 3.3.1! |
对于最新的稳定版本,请使用 Spring Data Commons 3.3.1! |
从 Spring Data 2.0 开始,返回单个聚合实例的存储库 CRUD 方法使用 Java 8 来指示可能缺少值。
除此之外,Spring Data 还支持在查询方法上返回以下包装器类型:Optional
-
com.google.common.base.Optional
-
scala.Option
-
io.vavr.control.Option
或者,查询方法可以选择根本不使用包装器类型。
然后通过返回来指示查询结果的缺失。
返回集合、集合替代项、包装器和流的存储库方法保证永远不会返回,而是返回相应的空表示形式。
有关详细信息,请参阅 “存储库查询返回类型”。null
null
可空性注释
您可以使用 Spring Framework 的可为 null 性注释来表达存储库方法的可为 null 性约束。
它们提供了一种工具友好的方法,并在运行时期间选择加入检查,如下所示:null
-
@NonNullApi
:在包级别用于声明参数和返回值的默认行为分别是既不接受也不生成值。null
-
@NonNull
:用于不能使用的参数或返回值(在适用的情况下,不需要用于参数和返回值)。null
@NonNullApi
-
@Nullable
:用于可以为 的参数或返回值。null
Spring 注解使用 JSR 305 注解(一种休眠但广泛使用的 JSR)进行元注解。
JSR 305 元注解允许工具供应商(如 IDEA、Eclipse 和 Kotlin)以通用方式提供空安全支持,而无需对 Spring 注解进行硬编码支持。
要启用查询方法的可为空性约束的运行时检查,您需要使用 Spring 的 in 在包级别上激活非 null 性,如以下示例所示:@NonNullApi
package-info.java
package-info.java
一旦非 null 默认值到位,存储库查询方法调用将在运行时验证是否存在 null 性约束。
如果查询结果违反定义的约束,则会引发异常。
当方法将返回但被声明为不可为 null(在存储库所在的包上定义的注释的默认值)时,就会发生这种情况。
如果要再次选择加入可为 null 的结果,请有选择地在各个方法上使用。
使用本节开头提到的结果包装器类型将继续按预期工作:空结果将转换为表示不存在的值。null
@Nullable
以下示例显示了刚才描述的一些技术:
package com.acme; (1)
import org.springframework.lang.Nullable;
interface UserRepository extends Repository<User, Long> {
User getByEmailAddress(EmailAddress emailAddress); (2)
@Nullable
User findByEmailAddress(@Nullable EmailAddress emailAdress); (3)
Optional<User> findOptionalByEmailAddress(EmailAddress emailAddress); (4)
}
1 | 存储库驻留在我们为其定义了非 null 行为的包(或子包)中。 |
2 | 当查询未生成结果时,将引发 。
当交给方法时抛出 。EmptyResultDataAccessException IllegalArgumentException emailAddress null |
3 | 当查询未生成结果时返回。
也接受作为 的值。null null emailAddress |
4 | 当查询未生成结果时返回。
当交给方法时抛出 。Optional.empty() IllegalArgumentException emailAddress null |
1 | 存储库驻留在我们为其定义了非 null 行为的包(或子包)中。 |
2 | 当查询未生成结果时,将引发 。
当交给方法时抛出 。EmptyResultDataAccessException IllegalArgumentException emailAddress null |
3 | 当查询未生成结果时返回。
也接受作为 的值。null null emailAddress |
4 | 当查询未生成结果时返回。
当交给方法时抛出 。Optional.empty() IllegalArgumentException emailAddress null |
基于 Kotlin 的存储库中的可为 null 性
Kotlin 在语言中嵌入了可空性约束的定义。
Kotlin 代码编译为字节码,字节码不通过方法签名表示可为 null 约束,而是通过编译的元数据表示。
确保在项目中包含 JAR,以便对 Kotlin 的可空性约束进行自省。
Spring Data 存储库使用语言机制来定义这些约束以应用相同的运行时检查,如下所示:kotlin-reflect
interface UserRepository : Repository<User, String> {
fun findByUsername(username: String): User (1)
fun findByFirstname(firstname: String?): User? (2)
}
1 | 该方法将参数和结果都定义为不可为 null(Kotlin 默认值)。
Kotlin 编译器拒绝传递给该方法的方法调用。
如果查询生成空结果,则抛出 an。null EmptyResultDataAccessException |
2 | 此方法接受参数,如果查询未生成结果,则返回。null firstname null |
1 | 该方法将参数和结果都定义为不可为 null(Kotlin 默认值)。
Kotlin 编译器拒绝传递给该方法的方法调用。
如果查询生成空结果,则抛出 an。null EmptyResultDataAccessException |
2 | 此方法接受参数,如果查询未生成结果,则返回。null firstname null |