2010-06-30 25 views
5

Tôi có một lớp Java (Thực thể) với một bộ truy vấn được đặt tên. Khi Spring cố gắng tiêm bean liên quan, nó không tìm thấy một trong các truy vấn.Nhận 'Không tìm thấy truy vấn được đặt tên' với khung công tác Spring

Một ví dụ:

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

Khi mùa xuân cố gắng để tiêm đậu, Tôi nhận:

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

tôi chắc rằng các truy vấn là chính xác (tất cả các bài kiểm tra đơn vị đối với họ là đi qua).

Có ai biết nguyên nhân gốc rễ của nó không?

+0

bạn kiểm tra đơn vị chúng như thế nào? Sử dụng Á hậu JUnit mùa xuân? – Bozho

+0

Bozho, ông đang sử dụng AbstractTransactionalJUnit4SpringContextTests để kiểm tra nó. –

Trả lời

1

Vâng, tôi đã gặp lỗi. Điều gì đã xảy ra như sau:

Trong lớp học của tôi có một phương thức được chú thích bằng @Resource, được gọi là truy vấn được đặt tên được khai báo trong một lớp khác được chú thích bằng @Entity).

Vì vậy, khi Spring injects và chạy phương thức, nó cố gắng sử dụng truy vấn được đặt tên. Tuy nhiên, truy vấn không phải là 'sẵn sàng' để được sử dụng và ngoại lệ được ném là truy vấn không được tìm thấy.

Để giải quyết điều này, tôi phải chạy một phương thức khác được gọi là khi việc tiêm vào mùa xuân kết thúc, tức là lớp của tôi phải triển khai giao diện org.springframework.context.ApplicationListener và phương thức onApplicationEvent đợi một org.springframework. context.event.ContextRefreshedEvent event.

Đó là tất cả mọi người. Cảm ơn bạn Bozho đã giúp đỡ của bạn.

5
  • đảm bảo đối tượng của bạn đã được ánh xạ/quét. Được chú thích với @Entity, nó có được thêm vào persistence.xml hoặc vào cấu hình nhà cung cấp có liên quan hay không hoặc nó được quét tự động hay không.

  • tôi muốn tiền tố tên của lớp với truy vấn - tức là MyEntity.Query1, MyEntity.Query1, vv

  • xác minh xem không có lỗi triển khai - tức là truy vấn của bạn là đúng

+0

Bozho: 1) Có, pháp nhân của tôi được chú thích bằng @Entity. Điểm chính là chỉ có MỘT truy vấn không được tìm thấy. Tất cả những người khác là. 2) Trong dự án thực của tôi, tôi đặt tên truy vấn của tôi là hằng số, chẳng hạn như QUERY1. Vì vậy, khi tôi gọi một truy vấn trong một lớp khác, nó có dạng: MyEntity.QUERY1. Vì vậy, tôi vẫn không có giải pháp cho vấn đề của tôi. Cảm ơn bạn anyway. –

+0

kiểm tra điểm thứ ba của tôi. – Bozho

+0

Điểm thứ ba của bạn được trả lời trong mô tả câu hỏi đã chỉnh sửa của tôi. Cảm ơn bạn một lần nữa. –

Các vấn đề liên quan