web-dev-qa-db-ja.com

特定のドメインクラスのSpringデータリポジトリインスタンスを取得するにはどうすればよいですか?

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

@Autowired
private List<Repository> repositories;

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

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

@Entity
public class Foo {
  ...
}

そして

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

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

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

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

24
Oliver Drotbohm
@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);
    }
}
16
Deepak

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

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

3
Udo