2013-01-10 4 views

risposta

2

La chiave per la soluzione viene Spring di org.springframework.data.repository.core.support.DefaultRepositoryMetadata che fornisce il metodo getDomainType().

DefaultRepositoryMetadata ha bisogno dell'interfaccia del repository come costruttore arg. Quindi è possibile eseguire il loop su tutti i repository esistenti, recuperare l'interfaccia del repository (che è ancora una parte complicata perché l'istanza del repository ha più di un'interfaccia) e trovare quella in cui getDomainType() è uguale a Foo.class.

18

primavera dati Commons contiene una classe Repositories che prende un ListableBeanFactory per trovare tutti i fagioli di repository definiti in esso ed espone un'API per ottenere questi casi per classe di dominio (attraverso ….getRepository(Class<?> type)).

Questa classe deve essere utilizzata con cura. Poiché è in corso una generazione di proxy seria per le istanze del repository, è necessario assicurarsi che l'istanza Repositories venga creata il più tardi possibile durante la creazione di ApplicationContext. Il modo migliore è implementare ApplicationListener e creare l'istanza ascoltando ContextRefreshedEvent.

Nel caso in cui si sta scrivendo un'applicazione web, il modo più sicuro per usare Repositories è di bootstrap i repository della ApplicationContext creato dal ContextLoaderListener e posizionare il Repositories (vedere la reference documentation di Spring MVC per i dettagli.

+6

Hai un esempio di codice per un'applicazione web? –

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); 
    } 
}