Java springboot注入泛型类型的Bean映射

Java springboot注入泛型类型的Bean映射,java,spring,spring-boot,Java,Spring,Spring Boot,Spring框架5 我有一个数据库实体的实例,我想为该实体使用相应的存储库。如何将实体映射的所有JPA存储库作为密钥注入 例如: public interface ARepository extends JpaRepository<AEntity, Long> {} public interface BRepository extends JpaRepository<BEntity, Long> {} 默认情况下,这种映射在运行时不可用。如果您喜欢黑客方法,并且确实需要

Spring框架5

我有一个数据库实体的实例,我想为该实体使用相应的存储库。如何将实体映射的所有JPA存储库作为密钥注入

例如:

public interface ARepository extends JpaRepository<AEntity, Long> {}
public interface BRepository extends JpaRepository<BEntity, Long> {}

默认情况下,这种映射在运行时不可用。如果您喜欢黑客方法,并且确实需要它,您可以为JPA存储库创建如下映射:

package com.example.repo;
导入java.lang.reflect.Method;
导入java.util.Collection;
导入java.util.Map;
导入java.util.function.function;
导入java.util.stream.collector;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
导入org.springframework.aop.framework.aopproxutils;
导入org.springframework.boot.ApplicationArguments;
导入org.springframework.boot.ApplicationRunner;
导入org.springframework.data.jpa.repository.JpaRepository;
导入org.springframework.data.jpa.repository.support.SimpleParepository;
导入org.springframework.data.util.ProxyUtils;
导入org.springframework.stereotype.Component;
导入org.springframework.util.ReflectionUtils;
导入lombok.RequiredArgsConstructor;
@组成部分
@所需参数构造函数
公共类AppRunner实现ApplicationRunner{
私有静态最终记录器log=LoggerFactory.getLogger(AppRunner.class);
私人最终收藏,类别>存储类别=r->{
if(SimpleJpaRepository.class.isAssignableFrom(ProxyUtils.getUserClass(r))){
Method=ReflectionUtils.findMethod(SimpleParepository.class,“getDomainClass”);
ReflectionUtils.MakeAccessable(方法);
返回(类)ReflectionUtils.invokeMethod(方法,aopproxutils.getSingletonTarget(r));
}
返回Void.class;
};
Map>jpaRepositoriesByClass=jpaRepositories.stream().collect(Collectors.toMap(repositoryClass,Function.identity());
log.info(“{}”,jpaRepositoriesByClass);
}
}
以下是我的解决方案:

@Bean
public Map<Class<?>, JpaRepository<?, ?>> jpaRepositoryMap(
        List<JpaRepository<?, ?>> jpaRepositories
) {
  return jpaRepositories.stream()
          .collect(Collectors.toMap(
                  jpaRepository -> resolveGenericType(jpaRepository, 0),
                  Function.identity()
          ));
}

private Class<?> resolveGenericType(Object object, int index) {
  return ResolvableType.forClass(JpaRepository.class, object.getClass())
          .getGenerics()[index].resolve();
}
@Bean
公共地图>jpaRepositoryMap(

我想你有一个配置类?
{ AEntity.class, ARepository }, { BEntity.class, BRepository }
@Bean
public Map<Class<?>, JpaRepository<?, ?>> jpaRepositoryMap(
        List<JpaRepository<?, ?>> jpaRepositories
) {
  return jpaRepositories.stream()
          .collect(Collectors.toMap(
                  jpaRepository -> resolveGenericType(jpaRepository, 0),
                  Function.identity()
          ));
}

private Class<?> resolveGenericType(Object object, int index) {
  return ResolvableType.forClass(JpaRepository.class, object.getClass())
          .getGenerics()[index].resolve();
}