2010-06-30 7 views
5

Ho una classe Java (Entity) con un insieme di query denominate. Quando Spring tenta di iniettare il bean correlato, non sta trovando una delle query.Ottenere 'Query denominata non trovata' con il framework Spring

A titolo di esempio:

@NamedQueries({ 
     @NamedQuery(name = "Query1", query = "..."), 
     @NamedQuery(name = "Query2", query = "..."), 
     @NamedQuery(name = "Query3", query = "..."), 
     @NamedQuery(name = "Query4", query = "..."), 
     @NamedQuery(name = "Query5", query = "...") 
}) 

Quando Primavera tenta di iniettare il fagiolo, sto ottenendo:

org.springframework.beans.factory.BeanCreationException: Error creating bean 
with name 'myBean': Injection of resource methods failed;nested exception is 
java.lang.IllegalArgumentException: Named query not found: Query3 at ... 

sono sicuro che le query sono corretti (tutti i test di unità per loro sono passaggio).

Qualcuno conosce la causa principale?

+0

come li stai testando? Usando la molla JUnit runner? – Bozho

+0

Bozho, sta usando AbstractTransactionalJUnit4SpringContextTests per testarlo. –

risposta

1

Beh, ho ricevuto l'errore. Quello che stava accadendo è il seguente:

Nella mia classe c'era un metodo annotato con @Resource, che chiamava la query denominata dichiarata in un'altra classe annotata con @Entity.

Così, quando inietta primavera ed esegue il metodo, si cerca di utilizzare la query di nome. Tuttavia, la query non è "pronta" per essere utilizzata e l'eccezione generata è che la query non è stata trovata.

Per risolvere questo, devo eseguire un metodo diverso chiamato quando le iniezioni Spring sono finite, cioè, la mia classe deve implementare l'interfaccia org.springframework.context.ApplicationListener e il metodo onApplicationEvent attende un org.springframework. context.event.ContextRefreshedEvent event.

Questo è tutto ragazzi. Grazie Bozho per il tuo aiuto.

5
  • assicurarsi che l'entità sia stata mappata/scansionata. È annotato con @Entity, è aggiunto allo persistence.xml o alla configurazione del fornitore pertinente, oppure viene automaticamente scansionato.

  • avrei prefisso al nome della classe alla query - cioè MyEntity.Query1, MyEntity.Query1 ecc

  • verificare se non ci sono errori di distribuzione - vale a dire che la query è corretta

+0

Bozho: 1) Sì, la mia entità è annotata con @Entity. Il punto principale è che non viene trovata una sola query. Tutti gli altri lo sono. 2) Nel mio progetto reale, chiamo la mia query come costanti, come QUERY1. Quindi, quando chiamo una query in un'altra classe, è nella forma: MyEntity.QUERY1. Quindi, non ho ancora una soluzione per il mio problema. Grazie lo stesso. –

+0

controlla il mio terzo punto. – Bozho

+0

Il terzo punto viene risposto nella descrizione della mia domanda modificata. Grazie ancora una volta. –