2010-05-15 17 views
5

GWT con JPAGWT con JPA - ningún proveedor de persistencia

Hay dos proyectos en mi espacio de trabajo de Eclipse, vamos a nombrarlos:

-JPAProject -GWTProject

JPAProject contiene material de configuración de la APP (permanencia .xml, clases de entidad, etc.). GWTProject es un proyecto ejemplar de GWT (tomado del tutorial oficial de GWT).

Ambos proyectos funcionan bien solos. Es decir, puedo crear EMF (EntityManagerFactory) en JPAProject y obtener entidades de la base de datos. GWTProject funciona bien también, puedo ejecutarlo, completar el texto del campo en el navegador y obtener la respuesta.

Mi objetivo es llamar a JPAProject desde GWTProject para obtener entidades. Pero el problema es que cuando se llama a DAO, me sale el siguiente excepción:

[WARN] Server class 'com.emergit.service.dao.profile.ProfileDaoService' could not be found in the web app, but was found on the system classpath 
[WARN] Adding classpath entry 'file:/home/maliniak/workspace/emergit/build/classes/' to the web app classpath for this session 

[WARN] /gwttest/greet 
javax.persistence.PersistenceException: No Persistence provider for EntityManager named emergitPU 
    at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source) 
    at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source) 
    at com.emergit.service.dao.profile.JpaProfileDaoService.<init>(JpaProfileDaoService.java:19) 
    at pl.maliniak.server.GreetingServiceImpl.<init>(GreetingServiceImpl.java:21) 
    ... 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488) 
[ERROR] 500 - POST /gwttest/greet (127.0.0.1) 3812 bytes 

supongo que las advertencias al principio pueden ser omitidos por ahora.

¿Tiene alguna idea? Creo que me falta algo básico. Todos los consejos son muy apreciados.


Actualización: Mi proveedor de persistencia está bien definido, el proyecto de la APP funciona bien por sí mismo.

Supongo que es problema relacionado con classpath también. Al ejecutar el proyecto GWT, en WEB-INF/lib, solo hay gwt-servlet.jar.

¿Cree que la única solución es crear un archivo Ant personalizado para compilar todo (es decir, hacer jar del proyecto JPA y copiarlo en WEB-INF/lib)? ¿O hay alguna solución de Eclipse, por lo que podría establecer las propiedades del proyecto GWT correctamente para que el proyecto GWT sepa incluir el archivo persistence.xml?

Actualización: OK, lo tengo funcionando. Intenté poner persitence.xml en todas partes en war/WEB-INF donde era posible, pero seguí obteniendo el error 'no persistence provider'. Resultó que no se trataba de persistencia.xml. No copié el archivo eclipselink en WEB-INF/lib, por lo que no pude encontrar la clase de proveedor definida en persistence.xml. Copiar todos los frascos hizo la cosa.

Muchas gracias Pascal.

+0

¿Puedes confirmar que no tienes habilitado Google App Engine por accidente? GAE no le permite conectarse a bases de datos, y es un error de principiante muy común. –

Respuesta

0

¿Tiene un proveedor persistente declarado en su persistence.xml? Algo como esto (estoy usando Hibernate aquí, adaptarlo a cualquier proveedor de persistencia que está utilizando):

<persistence 
    <persistence-unit name="emergitPU" transaction-type="..."> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    ... 
    </persistence-unit> 
</persistence> 

Si lo hace, entonces sospecho un problema ruta de clase. ¿Ha empaquetado correctamente el proyecto JPA en la aplicación web, es decir, en WEB-INF/lib?

+0

Gracias. Tengo un proveedor de persistencia bien definido, mencioné que el proyecto JPA funciona bien por sí mismo. Supongo que es un problema relacionado con classpath también. Al ejecutar el proyecto GWT, en WEB-INF/lib solo hay gwt-servlet.jar. ¿Cree que la única solución es crear un archivo ant personalizado para compilar todo (es decir, hacer jar del proyecto JPA y copiarlo en WEB-INF/lib)? ¿O hay alguna solución de Eclipse, por lo que podría establecer las propiedades del proyecto GWT correctamente para que el proyecto GWT sabría incluir el archivo persistence.xml? – meliniak

+0

Ok, ahora es un comentario, no una respuesta. Por cierto, lo malo es que no se puede proporcionar una nueva línea aquí, por lo que la publicación no se puede formatear para facilitar la lectura. He hecho el contenedor con META-INF/persistence.xml y lo puse en WEB-INF/lib, pero todavía no funciona. Me he quedado sin ideas, ¿le queda algo para compartir? – meliniak

+0

@meliniak Gracias. En caso de que no lo hayas notado, puedes editar tu pregunta para actualizarla (he trasladado el seguimiento a la pregunta inicial). De vuelta a tu pregunta ahora. ¿Obtiene la misma advertencia cuando empaqueta el contenedor en 'WEB-INF/lib'? Si no, ¿puedes actualizar la pregunta con el nuevo rastro? –

2

Luchando mucho con el mismo mensaje de error, he resuelto el problema de copiar todos los archivos jar (eclipselink.jar, eclipselink-jpa-modelgen_2.1.0.v20100614-r7608.jar, javax.persistence_1.0.0.jar, javax. persistence_2.0.1.v201006031150.jar) desde el archivo zip de EclipseLink a la carpeta .../war/WEB-INF/lib de mi proyecto GWT para que todo esté disponible para el Jetty en modo alojado. Como puede ver en la lista de archivos, estaba usando EclipseLink 2.1. Adapte esta lista a su implementación de JPA, si es necesario.

Esperando que esto también pueda serle útil.

+0

¡Muchas gracias por esta solución, un largo día de búsqueda finalmente llega a su fin! – Josh

Cuestiones relacionadas