2013-01-10 18 views
8

Biorąc pod uwagę listę wszystkich repozytoriów danych wiosna w jakiejś klasie Bar:Jak odzyskać instancję repozytorium danych sprężyn dla danej klasy domeny?

@Autowired 
private List<Repository> repositories; 

Jak mogę znaleźć repozytorium dla istniejącej klasy domeny Foo na powyższej liście?

Zakładając, że istnieje co następuje:

@Entity 
public class Foo { 
    ... 
} 

i

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

Odpowiedz

2

Kluczem do rozwiązania jest sprężyny org.springframework.data.repository.core.support.DefaultRepositoryMetadata która przewiduje metodę getDomainType().

DefaultRepositoryMetadata potrzebuje interfejsu repozytorium jako argumentu konstruktora. Tak więc można zapętlić się nad wszystkimi istniejącymi repozytoriami, pobrać interfejs repozytorium (który nadal jest trudny, ponieważ instancja repozytorium ma więcej niż jeden interfejs) i znaleźć ten, w którym getDomainType() jest równy równy Foo.class.

18

Spring Data Commons zawiera klasę Repositories, która pobiera ListableBeanFactory, aby znaleźć wszystkie komponenty bean repozytorium zdefiniowane w niej i udostępnia API w celu uzyskania tych instancji według klasy domeny (poprzez ….getRepository(Class<?> type)).

Tej klasy należy używać z ostrożnością. Ponieważ istnieje kilka poważnych generowania proxy dla instancji repozytorium, musisz upewnić się, że instancja Repositories została utworzona tak późno, jak to możliwe podczas tworzenia ApplicationContext. Preferowanym sposobem jest implementacja ApplicationListener i utworzenie instancji przez odsłuchanie ContextRefreshedEvent.

W przypadku piszesz aplikację internetową, najbezpieczniej używać Repositories jest ładowanie początkowe repozytoriów w ApplicationContext stworzonej przez ContextLoaderListener i umieść Repositories (patrz reference documentation Spring MVC dla szczegółów.

+6

Czy masz próbkę kodu do aplikacji internetowej? –

7
@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); 
    } 
} 
Powiązane problemy