2013-02-27 10 views
14

Sto tentando di ottenere un riferimento alla mia interfaccia repository (UserRepository) che si estende CrudRepository nel mio implementazione personalizzata (UserRepositoryExtensionImpl) al fine di ottenere l'accesso a tutti i metodi forniti da Spring JPA.CrudRepository dentro la mia implementazione repository personalizzati

Crud Extension: Interfaccia

@Repository 
public interface UserRepository extends CrudRepository<User, String>, UserRepositoryExtension<RosterUser> { 
    ...any custom spring JPA methods... 
} 

Estensione: Attuazione

@Repository 
public interface UserRepositoryExtension <T> { 
    public T put(T entity); 
} 

personalizzata:

public class UserRepositoryExtensionImpl implements UserRepositoryExtension<User> { 

    UserRepository userRepository; 

    @Autowired 
    public UserRepositoryExtensionImpl(UserRepository userRepository) { 
     this.userRepository = userRepository; 
    } 

    @Override 
    public User put(User user) { 
     System.out.println(user + "was put"); 
     // ...put logic here 
     return null; 
    }... 
} 

Tuttavia, sono in grado di iniettare UserRepository poiché una dipendenza circolare esiste (dato che UserRepository estende l'interfaccia implementata da il mio UserRepositoryImpl). Sto ottenendo il seguente errore:

org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name ' userRepositoryImpl': Requested bean is currently in creation: Is there an unresolvable circular  reference? 

Una possibile, ma meno di soluzione ideale sarebbe quella di iniettare e EntityManager in UserRepositoryImp, ma in quel caso, non ho accesso a uno dei metodi di Primavera JPA forniti da CrudRepository o altri metodi aggiuntivi che potrei aver creato in UserRepository.

Qualche suggerimento su come aggirare questo?

Qualsiasi aiuto sarebbe molto apprezzato.

EDIT: Come indicato nella risposta @ di Shelley, sono stato in grado di risolvere questo facendo 3 modifiche:

  • Rimozione del @Repository da UserRepositoryExtensionImpl
  • Rinominare UserRepositoryExtensionImpl a UserRepositoryImpl. Apparentemente questo rende la primavera consapevole dell'esistenza dell'implementazione. Vedere Spring Doc
  • Rimozione mio costruttore e spostando il @Autowired al userRepository campo

SUCCESSO!

+0

Se non c'è alcuna dipendenza effettiva circolare (es: Primavera appena si confondono perché pensa di avere molti chicchi di tipo simile). Aggiungi qualificatori aggiuntivi come ID bean in modo che Spring sappia quale bean da autowire. – gerrytan

+0

dacci il tuo contesto di app di primavera – Elbek

+1

@gerrytan - Potrei sbagliarmi, ma penso che ci sia una dipendenza circolare. A proposito: lo stesso problema viene riferito [qui] (http://forum.springsource.org/showthread.php?132889-Spring-Data-Calling-default-CRUD-methods-inside-a-custom-repository-implementation&p= 439701 # post439701) –

risposta

9

Un paio di piccole cose devono essere cambiate in modo che questo funzioni:

  • Rimuovere il @Repository annotazioni dall'interfaccia repository personalizzato (UserRepositoryExtension).

  • L'implementazione del repository personalizzato deve essere denominata "<StandardRepository>Impl" anziché "<CustomRepository>Impl". Nell'esempio di codice, questo dovrebbe essere UserRepositoryImpl anziché UserRepositoryExtensionImpl.

+0

Grazie @shelley! Il tuo suggerimento, oltre a spostare il '@ Autowired' dal costruttore al campo' userRepository', ha risolto il problema. Ora posso fare riferimento a 'UserRepository' all'interno della mia implementazione personalizzata. :) –

0

C'è un well defined way to create custom repository implementations in Spring Data JPA che dovresti seguire. Fondamentalmente è necessario estendere CrudRepository in modo da non dover iniettarne un'istanza nell'implementazione personalizzata.

+0

Penso che OP segua questo approccio ma vorrei usare metodi dal bean di repository standard all'interno dell'implementazione del repository personalizzato. – shelley

+0

@zagyi, Shelley ha ragione. Sto cercando di seguire lo stesso approccio suggerito da Spring, ed è così che mi sono trovato nella posizione in cui mi trovo. Aggiungerò ulteriori dettagli alla domanda per rendere più chiaro il problema. –

+0

@shelley, @Julian: mi spiace, dopo aver attentamente riletto la domanda, è chiaro che ho mal interpretato male. Comunque penso che sia una cosa strana quello che Julian cerca di fare. Di solito si tratta di una classe di servizio in cui si dovrebbero iniettare istanze di repository e implementare metodi di livello superiore che chiamano una o più operazioni di repository. Verificare se avrebbe più senso spostare la logica di 'put()' un livello più in alto in un'interfaccia/classe di servizio. – zagyi

0

Ho risolto problema iniettando ApplicationContext e ottenere fagiolo in modo artificiale utilizzando applicationContext.getBean(UserRepository.class). Funziona in questo modo.

4

Come ha sottolineato Shelley, la denominazione è davvero importante per far funzionare il lavoro autowire. Nell'esempio seguente, seguo lo standard di denominazione corretto per la mia interfaccia personalizzata e la sua implementazione. Ma la mia interfaccia che ha esteso il JpaRepository è stata chiamata "ItemDao" invece di "ItemRepository", questo ha provocato che la primavera ignora completamente la mia implementazione personalizzata ...

OBS !!! Dovrebbe essere "ItemRepository"

@Repository 
public interface ItemDao extends JpaRepository<Item, Long>, ItemRepositoryCustom {} 

mia interfaccia

interface ItemRepositoryCustom {...} 

mia classe di implementazione

class ItemRepositoryImpl implements ItemRepositoryCustom {...} 

Se qualcuno ha problemi simili, inizia seguendo lo standard di denominazione utilizzata nella documentazione di primavera al link sottostante.

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.custom-implementations

+1

Vorrei che dettagli come questi fossero menzionati in modo più esplicito ... Ma sì, la denominazione sembra essere piuttosto importante. Sono contento che tu sia stato in grado di capirlo anche tu! –

+1

Io a, quando leggi una sezione della documentazione senza precedenti conoscenze primaverili, non c'è modo di capire quanto sia rigida la regola di denominazione. – Olle89

Problemi correlati