2010-06-30 17 views
5

Mam klasę Java (Entity) z zestawem nazwanych zapytań. Kiedy Spring próbuje wstrzyknąć powiązany komponent bean, nie znajduje jednego z zapytań.Uzyskiwanie "nieznanego zapytania nie znaleziono" w ramach Spring Framework

Jako przykład:

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

Kiedy wiosna próbuje wstrzyknąć fasoli, jestem coraz:

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 ... 

jestem pewien, że zapytania są prawidłowe (wszystkie testy jednostkowe dla nich przechodzący).

Czy ktoś wie, na co go stać?

+0

jak je testujesz? Korzystasz ze sprężynowej prowadnicy JUnit? – Bozho

+0

Bozho, używa testu AbstractTransactionalJUnit4SpringContextTests do przetestowania go. –

Odpowiedz

1

Cóż, mam błąd. To, co się działo, jest następujące:

W mojej klasie istniała jedna metoda z adnotacją @Resource, która wywoływała nazwane zapytanie zadeklarowane w innej klasie z adnotacją @Entity).

Tak więc, gdy Spring wstrzykuje i uruchamia metodę, próbuje użyć nazwanego zapytania. Jednak zapytanie nie jest "gotowe" do użycia, a wyjątek jest taki, że zapytanie nie zostało znalezione.

Aby rozwiązać ten problem, muszę uruchomić inną metodę wywoływaną po zakończeniu iniekcji Spring, tj. Moja klasa musi zaimplementować interfejs org.springframework.context.ApplicationListener, a metoda onApplicationEvent czeka na org.springframework. context.event.ContextRefreshedEvent event.

To wszystko chłopaki. Dziękuję Bozho za twoją pomoc.

5
  • upewnij się, że twój obiekt został zamapowany/zeskanowany. Czy jest to opatrzone przypisami @Entity, czy jest ono dodawane do persistence.xml lub do odpowiedniej konfiguracji dostawcy, czy też jest automatycznie skanowane.

  • bym poprzedzić nazwę klasy do zapytania - czyli MyEntity.Query1, MyEntity.Query1 itp

  • sprawdzić, czy nie ma błędów rozmieszczenia - to znaczy, że zapytanie jest poprawne

+0

Bozho: 1) Tak, mój podmiot jest opatrzony adnotacją @Entity. Najważniejsze jest to, że nie znaleziono tylko JEDNEGO zapytania. Wszystkie pozostałe są. 2) W moim prawdziwym projekcie nazywam moje zapytanie jako stałe, takie jak QUERY1. Tak więc, gdy wywołuję jedno zapytanie w innej klasie, jest to w formie: MyEntity.QUERY1. Wciąż nie mam rozwiązania dla mojego problemu. Mimo wszystko dziekuję. –

+0

sprawdź mój trzeci punkt. – Bozho

+0

Twój trzeci punkt jest odpowiedzią na mój edytowany opis pytania. Jeszcze raz dziękuję. –