如何在运行时检索 Spring Data 存储库的实际类型参数?

问题描述 投票:0回答:1

假设我有这个

Repository

public interface ProductRepository extends JpaRepository<Product, Integer> {}

并且我想在运行时知道这个存储库持续存在

Product
,而不是
Account
或其他任何东西。到目前为止我只想出了这个解决方案:

Class<?> persistedClass = ((ParameterizedType) repository.getClass() // some Spring proxy
    .getInterfaces()[0] // ProductRepository or the like
    .getGenericInterfaces()[0]) // JpaRepository
    .getActualTypeArguments()[0] // the first type argument

让我们暂时忽略这种笨拙(这不是 Java Reflection API 课程的标准吗?)。更糟糕的是,我不得不删除

--release
选项,这使得解决方案的可移植性稍差(IntelliJ 中默认启用它)。有一些东西使得
java.base
(这是
ParameterizedType
所在的位置)和
--release
不兼容,从而阻止编译(我不太明白)

是否有更好的方法在运行时检索该信息?

java generics spring-data-jpa spring-data
1个回答
0
投票

您只需调用

AbstractRepositoryMetadata.getMetadata(…)
并调用
getDomainType()
等即可获得结果。

如果您对反向查找感兴趣,即查找域类型的存储库,您可以从

Repositories(…)
创建一个
ListableBeanFactory
实例,它将查找在该
BeanFactory
中注册的存储库实例的所有元数据.

© www.soinside.com 2019 - 2024. All rights reserved.