java - 从 Spring Data 存储库获取支持的类型
问题描述
我的 Spring Boot 应用程序中存在一个存储库 bean 列表,我需要将每个存储库 bean 链接CrudRepository
到相应的实体类,所以我以一个Map<Class, CrudRepository>
对象结束。
示例存储库:
public interface ReviewRepository extends CrudRepository<Review, ReviewId>
我需要以下方法将存储库与适当的实体类链接起来的帮助:
@Service
public class MyService {
final Map<Class, CrudRepository> repositoryMap;
public MyService(List<Class> entityClasses, List<CrudRepository> existingRepositories) {
this.repositoryMap = logicGoesHere(entityClasses, existingRepositories); // <== HERE
}
解决方案
这行得通。可能[0]
应该由实际查找替换(在我的情况下,零是一个正确的索引)
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;
import sun.reflect.generics.repository.ClassRepository;
import static java.util.function.Function.*;
import static java.util.stream.Collectors.*;
@Configuration
class Config {
@Bean
public Map<Class, JpaRepository> classToRepo( List<JpaRepository> repos) {
return repos.stream().collect(toMap(this::extractEntityClass, identity()));
}
private Class extractEntityClass(JpaRepository repository) {
try {
Method getGenericInfo = Class.class.getDeclaredMethod("getGenericInfo");
getGenericInfo.setAccessible(true);
ClassRepository cr = (ClassRepository) getGenericInfo.invoke(repository.getClass().getInterfaces()[0]);
Type t = ((ParameterizedTypeImpl) cr.getSuperInterfaces()[0]).getActualTypeArguments()[0];
return (Class) t;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
你可以使用注入它@Qualifier("classToRepo")
推荐阅读
- sql - 添加虚拟列以按它排序但不返回它
- veriblock - 我希望有人可以改进veriblock的python-grpc示例
- keras - Keras add_loss 不适用于编码器-解码器模型上的 y 数据(y_train,y_test)
- mongodb - 使用 $unwind 时,我可以避免使用相同的 $match 条件两次吗?
- excel - Excel根据多个条件从另一张表中获取值
- python - Linux 上的 Redis 管道崩溃
- javascript - 显示具有多个对象的数组值
- shell - 使用管道调用输出到 stderr 的命令行应用程序
- admob - adMob 隐私权政策
- angular - Angular 7. NullInjectorError:没有 HttpClient 的提供者!即使 app.module 有 HttpClientModule。如何解决?