首页 > 解决方案 > 从 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
    }

标签: javaspringspring-data-jpaspring-data

解决方案


这行得通。可能[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")


推荐阅读