[英]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.