繁体   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