如何检索给定域类的spring数据存储库实例?

Udo*_*Udo 18 java spring jpa spring-data spring-data-jpa

给出某些类中所有spring数据存储库的列表Bar:

@Autowired
private List<Repository> repositories;
Run Code Online (Sandbox Code Playgroud)

如何Foo在上面的列表中找到现有域类的存储库?

假设存在以下内容:

@Entity
public class Foo {
  ...
}
Run Code Online (Sandbox Code Playgroud)

public interface FooRepository extends JpaRepository<Foo, String> {}
Run Code Online (Sandbox Code Playgroud)

Oli*_*ohm 25

Spring Data Commons包含一个类Repositories,该类ListableBeanFactory用于查找在其中定义的所有存储库bean,并公开API以通过域类(通过….getRepository(Class<?> type))获取这些实例.

应谨慎使用本课​​程.由于存储库实例正在进行一些严格的代理生成,因此您必须确保在Repositories创建期间尽可能晚地创建实例ApplicationContext.首选方法是ApplicationListener通过监听实现和创建实例ContextRefreshedEvent.

如果您正在编写Web应用程序,最安全的使用方法Repositories是通过引导ApplicationContext创建的存储库ContextLoaderListener并放置Repositories(有关详细信息,请参阅Spring MVC 的参考文档).

  • 您是否有Web应用程序的代码示例? (11认同)

Dee*_*pak 16

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Udo*_*Udo 3

解决这个问题的关键是Springorg.springframework.data.repository.core.support.DefaultRepositoryMetadata提供的方法getDomainType()

DefaultRepositoryMetadata需要存储库接口作为构造函数参数。因此,我们可以遍历所有现有存储库,检索存储库接口(这仍然是一个棘手的部分,因为存储库实例有多个接口)并找到getDomainType()equals 的接口Foo.class