簡體   English   中英

從Spring Data存儲庫獲取支持的類型

[英]Get supported type from Spring Data repository

我有一個存儲在我的Spring Boot應用程序中的存儲庫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")注入它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM