Comment faire pour récupérer des données du printemps instance de référentiel pour un domaine donné de la classe?
Donné la liste de tous les printemps, référentiels de données dans une classe Bar
:
@Autowired
private List<Repository> repositories;
Comment puis-je trouver le référentiel pour un domaine existant classe Foo
dans la liste ci-dessus?
En supposant que la suivante existe:
@Entity
public class Foo {
...
}
et
public interface FooRepository extends JpaRepository<Foo, String> {}
OriginalL'auteur Udo | 2013-01-10
Vous devez vous connecter pour publier un commentaire.
Printemps de Données Communes contient une classe
Repositories
qui prend unListableBeanFactory
pour trouver toutes référentiel haricots sont définis et expose une API pour obtenir ces instances par domaine (de la classe par le biais de….getRepository(Class<?> type)
).Cette classe doit être utilisée avec précaution. Comme il y a un peu de sérieux génération de proxy pour le référentiel cas, vous devez vous assurer que les
Repositories
instance est créée le plus tard possible au cours de laApplicationContext
création. Le meilleur moyen est de mettre en œuvreApplicationListener
et de créer une instance par l'écoute de laContextRefreshedEvent
.Dans le cas où vous écrivez une application web, la façon la plus sûre d'utiliser
Repositories
est en mettant en place des référentiels dans l'ApplicationContext
créé par leContextLoaderListener
et de la place de laRepositories
(voir la la documentation de référence de Spring MVC pour plus de détails.OriginalL'auteur Oliver Drotbohm
OriginalL'auteur Deepak
La clé de la solution est
Le printemps
org.springframework.data.repository.core.support.DefaultRepositoryMetadata
qui fournit la méthodegetDomainType()
.DefaultRepositoryMetadata
besoins du référentiel d'interface en tant que constructeur arg. Donc, on peut boucler sur tous les dépôts existants, récupérer le référentiel de l'interface (ce qui est encore plus compliqué parce que l'instance de référentiel a plus d'une interface) et de trouver celle oùgetDomainType()
est égal àFoo.class
.OriginalL'auteur Udo