22

あるクラスのすべての春のデータリポジトリのリストを考えるとBar

@Autowired
private List<Repository> repositories;

Foo上記のリストで既存のドメインクラスのリポジトリを見つけるにはどうすればよいですか?

以下が存在すると仮定します。

@Entity
public class Foo {
  ...
}

public interface FooRepository extends JpaRepository<Foo, String> {}
4

3 に答える 3

26

Spring Data Commons には、定義されているすべてのリポジトリ Bean を検索するために を使用するクラスRepositoriesが含まれListableBeanFactoryており、これらのインスタンスをドメイン クラスによって取得するための API を公開します ( を介して….getRepository(Class<?> type))。

このクラスは注意して使用する必要があります。リポジトリ インスタンスに対して深刻なプロキシ生成が行われているため、Repositoriesインスタンスが作成中にできるだけ遅く作成されるようにする必要がありますApplicationContext。推奨される方法は、ApplicationListenerをリッスンしてインスタンスを実装および作成することContextRefreshedEventです。

Web アプリケーションを作成している場合、使用する最も安全な方法は、によって作成されRepositoriesたリポジトリをブートストラップして配置することです(詳細については、Spring MVCのリファレンス ドキュメントを参照してください。ApplicationContextContextLoaderListenerRepositories

于 2013-01-13T20:15:14.460 に答える
19
@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);
    }
}
于 2015-07-14T10:37:29.990 に答える
3

ソリューションの鍵org.springframework.data.repository.core.support.DefaultRepositoryMetadataは、メソッドを提供するSpringgetDomainType()です。

DefaultRepositoryMetadataコンストラクタ引数としてリポジトリ インターフェイスが必要です。そのため、既存のすべてのリポジトリをループして、リポジトリ インターフェイスを取得し (リポジトリ インスタンスには複数のインターフェイスがあるため、これはまだ難しい部分です)、getDomainType()等しいものを見つけることができますFoo.class

于 2013-01-11T10:58:58.297 に答える