簡體   English   中英

如何檢索給定域 class 的 spring 數據存儲庫實例?

[英]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創建的ApplicationContextRepositories並放置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.

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