2010-06-30 13 views
5

Tengo una clase Java (Entity) con un conjunto de consultas con nombre. Cuando Spring intenta inyectar el bean relacionado, no encuentra una de las consultas.Obteniendo 'Búsqueda con nombre no encontrada' con Spring framework

Como ejemplo:

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

Cuando primavera intenta inyectar el frijol, estoy recibiendo:

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

estoy seguro de las consultas son correctos (todas las pruebas unitarias para ellos son paso).

¿Alguien sabe la causa raíz?

+0

¿cómo las prueba usted por unidad? ¿Usando el corredor de primavera JUnit? – Bozho

+0

Bozho, él está usando AbstractTransactionalJUnit4SpringContextTests para probarlo. –

Respuesta

1

Bueno, tengo el error. Lo que estaba sucediendo es el siguiente:

En mi clase había un método anotado con @Resource, que llamaba a la consulta nombrada declarada en otra clase anotada con @Entity).

Por lo tanto, cuando Spring inyecta y ejecuta el método, intenta utilizar la consulta con nombre. Sin embargo, la consulta no está 'lista' para ser utilizada, y la excepción lanzada es que no se encontró la consulta.

Para resolver esto, tengo que ejecutar un método diferente llamado cuando las inyecciones de Spring están terminadas, es decir, mi clase tiene que implementar la interfaz org.springframework.context.ApplicationListener y el método onApplicationEvent espera un org.springframework. evento context.event.ContextRefreshedEvent.

Eso es todo chicos. Gracias Bozho por tu ayuda.

5
  • asegúrese de que su entidad ha sido asignada/escaneada. ¿Está anotado con @Entity, se ha agregado al persistence.xml o a la configuración del proveedor correspondiente, o se escanea automáticamente.

  • Me prefijo del nombre de la clase a la consulta - es decir MyEntity.Query1, etc. MyEntity.Query1

  • verificar si no hay errores de implementación - es decir, que la consulta es correcta

+0

Bozho: 1) Sí, mi entidad está anotada con @Entity. El punto principal es que solo UNA consulta no se encuentra. Todos los demás son 2) En mi proyecto real, nombro mi consulta como constantes, como QUERY1. Entonces, cuando llamo a una consulta en otra clase, está en la forma: MyEntity.QUERY1. Entonces, todavía no tengo solución para mi problema. Gracias de todos modos. –

+0

verifique mi tercer punto. – Bozho

+0

Su tercer punto se responde en la descripción de mi pregunta editada. Gracias una vez más. –

Cuestiones relacionadas