2010-11-12 13 views
5

Estoy ejecutando Glassfish 3.1-INSTANTÁNEA a partir de hoy (2010-11-12).Reparando los errores "No se pudo resolver una unidad de persistencia ..." cuando se especifica PU, se encontró

Estoy usando el EJBContainer incorporado.

En el classpath, según lo informado por el EJBContainer, tengo un META-INF/persistence.xml. Este archivo define dos unidades de persistencia: una llamada "ngp" y otra llamada "cx".

El resultado de la depuración muestra que Glassfish JPA deployer lo encuentra, y reconoce tanto la PU cx como la PU ngp.

Las bombas EJBContainer a cabo con el siguiente error APP todo demasiado común:

java.lang.RuntimeException: Could not resolve a persistence unit corresponding to the persistence-context-ref-name [cx] in the scope of the module called [/Users/ljnelson/Projects/foo/target/test-classes/]. Please verify your application. 
at com.sun.enterprise.deployment.BundleDescriptor.findReferencedPUViaEMRef(BundleDescriptor.java:693) 
at com.sun.enterprise.deployment.EjbBundleDescriptor.findReferencedPUs(EjbBundleDescriptor.java:910) 
at org.glassfish.persistence.jpa.JPADeployer.prepare(JPADeployer.java:140) 
at com.sun.enterprise.v3.server.ApplicationLifecycle.prepareModule(ApplicationLifecycle.java:869) 
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:410) 
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240) 
at org.glassfish.kernel.embedded.EmbeddedDeployerImpl.deploy(EmbeddedDeployerImpl.java:193) 
at org.glassfish.kernel.embedded.EmbeddedDeployerImpl.deploy(EmbeddedDeployerImpl.java:142) 
at org.glassfish.ejb.embedded.EJBContainerImpl.deploy(EJBContainerImpl.java:135) 
at org.glassfish.ejb.embedded.EJBContainerProviderImpl.createEJBContainer(EJBContainerProviderImpl.java:132) 
at javax.ejb.embeddable.EJBContainer.createEJBContainer(EJBContainer.java:127) 

que subrayar una vez más que los registros de la implementación muestran que, al menos, que el desarrollador se encuentra con dos unidades de persistencia.

La clase que quiere usar el "cx" PU contiene el texto modelo habitual:

@PersistenceContext(unitName="cx") 
private EntityManager em; 

El persistence.xml está presente en (el lugar de costumbre Maven) target/test-classes/META-INF y tiene el siguiente aspecto:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 

    <persistence-unit name="cx" transaction-type="JTA"> 
     <jta-data-source>java:global/jdbc/H2Test</jta-data-source> 
     <!-- snip --> 
    </persistence-unit> 

    <persistence-unit name="ngp" transaction-type="JTA"> 
     <jta-data-source>java:global/jdbc/H2Test</jta-data-source> 
     <!-- snip --> 
    </persistence-unit> 

</persistence> 

El EJBContainer Glassfish incorporado, mientras que hace su trabajo, da salida a esto:

Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log 
FINE: Got [email protected] 
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log 
FINER: With attribute name 
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log 
FINER: With value cx 
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log 
FINE: in class com.sun.enterprise.deployment.PersistenceUnitDescriptor method setName with cx 
...snip... 
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log 
FINE: Got [email protected] 
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log 
FINER: With attribute name 
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log 
FINER: With value ngp 
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log 
FINE: in class com.sun.enterprise.deployment.PersistenceUnitDescriptor method setName with ngp 

Solucionar problemas de recetas, ¿alguien?

+0

Debo mencionar que estoy usando JTA - transacciones administradas por contenedor - en ambas PU. Se me ocurre que XA sería un requisito aquí. ¿El hecho de que mis fuentes de datos de prueba no sean compatibles con XA es la causa de este error? –

+0

Se actualizaron las fuentes de datos para usar XA; sin efecto. –

+0

Si las fuentes de datos son XA o no, no debería importar, al menos no ahora (podría ser más tarde si decide usar ambos EM al mismo tiempo, pero esa es otra historia). ¿Funciona con solo una PU? –

Respuesta

5

Esta es una combinación de comportamiento extraño y error de piloto.

Primero, el error del piloto.

El caso de prueba de JUnit particular que estaba viendo era el de un colega, y fue nombrado como si fuera un EJB, siguiendo nuestra convención interna de nomenclatura. Este es probablemente un error de cortar y pegar por parte de mi colega.

Menciono eso porque cada vez que abrí el archivo lo miré como si fuera un EJB.

Pero, por supuesto, no es un EJB.

Sin embargo, misteriosamente, hay una anotación @PersistenceContext allí, y una EntityManager, que no se utiliza. El contexto de persistencia tiene un atributo de - lo adivinaste-- unitName="cx".

El extraño comportamiento es que en algún lugar entre el antiguo contenedor EJB, que ejecutó bien este caso de prueba, y ahora, el contenedor EJB comenzó a tratar esta clase no EJB no especial como un objetivo válido para inyección @PersistenceContext. Quizás este caso de prueba se trate como un bean gestionado, pero tuve la impresión de que los beans administrados en un entorno que no es de CDI tenían que ser anotados como tales.

De todos modos, una vez que eliminé esta anotación espuria @PersistenceContext, todo funcionó bien.

+0

Esto explica una gran parte del problema. Sin embargo, el cambio entre GF 3.0.1 y GF 3.1 es realmente extraño (y podría haber un error en alguna parte). ¿Su archivo está habilitado para CDI (tiene un beans.xml)? –

+0

No, deliberadamente NO está habilitado para CDI, ya que Glassfish ha tenido todo tipo de problemas horribles con CDI en el pasado. –

4

Si por error pones @PersistenceContext (name = "cx") en lugar de @PersistenceContext (unitName = "cx") obtienes el mismo error con todo lo demás funcionando.

+1

Bienvenido a SO. Para referencia futura, debería considerar dar una respuesta más detallada y completa; de lo contrario, podría recibir una votación negativa/marcar una bandera. :) Feliz codificación. –

+1

De acuerdo, la respuesta es un poco corta, pero fue la solución para mi problema. –

Cuestiones relacionadas