gpt4 book ai didi

java - 如何将 Kotlin 默认方法与 Spring Data 存储库接口(interface)一起使用?

转载 作者:搜寻专家 更新时间:2023-11-01 01:24:46 24 4
gpt4 key购买 nike

考虑以下存储库接口(interface)声明:

interface KotlinUserRepository : Repository<User, String> {

fun findById(username: String): User

fun search(username: String) = findById(username)
}

我正在声明一个默认接口(interface)方法 search(…),它默认调用 findById(…)

启动我的应用程序失败:

org.springframework.data.mapping.PropertyReferenceException: 找不到类型 User 的属性搜索!

如何将 Kotlin 默认方法与 Spring Data 存储库接口(interface)一起使用并防止 PropertyReferenceException

最佳答案

长话短说

Kotlin 1.1/1.2 首先将默认方法编译为抽象接口(interface)方法。无法在 Spring Data 存储库接口(interface)中使用 Kotlin 的默认方法。

解释

Kotlin 允许使用 Java 运行时版本 1.6 的默认接口(interface)方法。 JVM 级别的默认接口(interface)方法是在 Java 1.8 中引入的。这导致 Kotlin 使用与 Java 不同的方法来编译默认接口(interface)方法。

KotlinUserRepository 中的代码编译为:

interface KotlinUserRepository extends Repository {

User findById(String username);

User search(String username);

@Metadata(…)
public static final class DefaultImpls {

public static User search(KotlinUserRepository $this, String username) {
Intrinsics.checkParameterIsNotNull(username, "username");
return $this.findById(username);
}
}
}

search(…) 方法编译为抽象接口(interface)方法。实现位编译为类 DefaultImpls,它反射(reflect)了默认方法签名。想要实现 KotlinUserRepository 的类需要实现 search(...)。在纯 Kotlin 环境中使用接口(interface)将使 Kotlin 编译器创建实现位。

Spring Data 存储库与下面的代理一起工作。存储库中的每个方法都必须是:

  1. 由商店特定的存储库实现。
  2. 由自定义实现实现。
  3. Java 8 默认方法。
  4. 使用查询注释进行注释。
  5. 适合方法命名方案以允许查询派生。

在这种情况下,search(…) 不会根据您实现 Java 接口(interface)的方式由任何自定义代码实现。 Spring Data 尝试派生查询并将 search(...) 视为 User 域类的属性。查找失败并抛出 PropertyReferenceException

这是一个已知的限制。

引用资料

关于java - 如何将 Kotlin 默认方法与 Spring Data 存储库接口(interface)一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49190066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com