![](/img/trans.png)
[英]How to retrieve data within a Map in java using findBy spring repository
[英]How to retrieve spring data repository instance for given domain class?
鑒於某些 class Bar
中的所有 spring 數據存儲庫的列表:
@Autowired
private List<Repository> repositories;
如何在上面的列表中找到現有域 class Foo
的存儲庫?
假設存在以下情況:
@Entity
public class Foo {
...
}
和
public interface FooRepository extends JpaRepository<Foo, String> {}
Spring Data Commons包含一個類Repositories
,它使ListableBeanFactory
查找在其中定義的所有存儲庫bean,並公開API以通過域類(通過….getRepository(Class<?> type)
)獲取這些實例。
應謹慎使用本課程。 由於存儲庫實例正在進行一些嚴格的代理生成,因此必須確保在創建ApplicationContext
期間盡可能晚地創建Repositories
實例。 首選方法是實現ApplicationListener
並通過偵聽ContextRefreshedEvent
來創建實例。
如果您正在編寫Web應用程序,使用Repositories
的最安全方法是引導ContextLoaderListener
創建的ApplicationContext
的Repositories
並放置Repositories
(有關詳細信息,請參閱Spring MVC的參考文檔) 。
@Service
public class GenericRepository {
@Autowired
private WebApplicationContext appContext;
Repositories repositories = null;
public GenericRepository() {
repositories = new Repositories(appContext);
}
public JpaRepository getRepository(AbstractPersistable entity) {
return (JpaRepository) repositories.getRepositoryFor(entity.getClass());
}
public Object save(AbstractPersistable entity) {
return getRepository(entity).save(entity);
}
public Object findAll(AbstractPersistable entity) {
return getRepository(entity).findAll();
}
public void delete(AbstractPersistable entity) {
getRepository(entity).delete(entity);
}
}
解決方案的關鍵是Spring的org.springframework.data.repository.core.support.DefaultRepositoryMetadata
,它提供了方法getDomainType()
。
DefaultRepositoryMetadata
需要存儲庫接口作為構造函數arg。 因此,可以循環遍歷所有現有存儲庫,檢索存儲庫接口(這仍然是一個棘手的部分,因為存儲庫實例具有多個接口)並找到getDomainType()
等於Foo.class
的存儲庫接口。
您可以使用 Spring 的GenericTypeResolver從您的存儲庫中獲取實體 class。
Repository<Foo, String> fooRepository = repositories.stream()
.filter(repository -> GenericTypeResolver
.resolveTypeArguments(repository.getClass(), Repository.class)[0].equals(Foo.class))
.findFirst().get();
這對我有用:
Repositories repositories = new Repositories(context);
CrudRepository repo = (CrudRepository) repositories.
getRepositoryFor(entityClass).get();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.