java - Usar clases de dominio JPA en Grails
groovy gorm (3)
Quiero utilizar un modelo de dominio JPA en una aplicación desarrollada utilizando el último hito de Grails (2.0.0.M1). Las clases de dominio JPA están en el directorio src/java
de la aplicación.
En base a esta publicación de blog que describe cómo usar un modelo de dominio JPA existente en una aplicación Grails, creé grails-app/conf/hibernate/hibernate.cfg.xml
con una lista de mis clases anotadas por JPA.
En caso de que alguien esté lo suficientemente aburrido como para querer ejecutar la aplicación, está disponible here . Cuando ejecuta la aplicación, se produce el siguiente error al iniciar
Error 2011-08-04 23:28:19,777 [Thread-8] ERROR context.GrailsContextLoader - Error executing bootstraps: Error creati
ng bean with name ''grailsDomainClassMappingContext'': Instantiation of bean failed; nested exception is org.springframewo
rk.beans.BeanInstantiationException: Could not instantiate bean class [org.codehaus.groovy.grails.domain.GrailsDomainCla
ssMappingContext]: Constructor threw exception; nested exception is java.lang.NullPointerException
Line | Method
->> 303 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 138 | run in java.util.concurrent.FutureTask
| 886 | runTask in java.util.concurrent.ThreadPoolExecutor$Worker
| 908 | run in ''''
^ 662 | run . . in java.lang.Thread
Caused by BeanInstantiationException: Could not instantiate bean class [org.codehaus.groovy.grails.domain.GrailsDomainCl
assMappingContext]: Constructor threw exception; nested exception is java.lang.NullPointerException
->> 303 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 138 | run in java.util.concurrent.FutureTask
| 886 | runTask in java.util.concurrent.ThreadPoolExecutor$Worker
| 908 | run in ''''
^ 662 | run . . in java.lang.Thread
Caused by NullPointerException: null
->> 123 | addPersistentEntityInternal in org.grails.datastore.mapping.model.AbstractMappingContext
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 115 | addPersistentEntity in ''''
| 127 | addPersistentEntityInternal in ''''
| 115 | addPersistentEntity in ''''
| 127 | addPersistentEntityInternal in ''''
| 115 | addPersistentEntity in ''''
| 303 | innerRun in java.util.concurrent.FutureTask$Sync
| 138 | run in java.util.concurrent.FutureTask
| 886 | runTask in java.util.concurrent.ThreadPoolExecutor$Worker
| 908 | run in ''''
^ 662 | run . . in java.lang.Thread
Curiosamente, el problema solo parece ser desencadenado por clases de dominio que tienen relaciones con otras clases de dominio. Si elimina todas las clases de dominio excepto SystemProperty
(que no se refiere a otras clases de dominio), la aplicación se iniciará sin error.
Intente utilizar META-INF/persistence.xml
( example ) (no sé exactamente dónde colocarlo, pero en última instancia debería ir a WEB-INF/META-INF/persistence.xml
, e incluir su archivo jar allí (en <jar-file>
element). Luego, por supuesto, necesitarás todos los beans de primavera correspondientes ( LocalEntityManagerFactoryBean
por ejemplo)
Si observa los guiones de inicio de grails ($ GRAILS_HOME $ / bin / grails y $ GRAILS_HOME $ / bin / startGrails), puede encontrar el argumento de classpath que se envía al lanzador de la aplicación grails org.codehaus.groovy.grails.cli. soporte.GrailsStarter.
Cuando ejecutas el comando grails generate-all com.model.User, el grial espera que esté disponible en la carpeta fuente o en el directorio lib. En su escenario, el jar está disponible como parte de la dependencia de Maven. Esta información no se transmite a lo largo del script de inicio de Grails. Necesitas especificar esta información.
El script de inicio tiene la opción de especificar el classpath. Por lo tanto, debe invocar el comando griales con la opción classpath que especifica la ubicación de los jar.
grails generate-all -cp E: / workspace / AppDomain.jar
También debe mencionar el contenedor con otros comandos. Ejemplo: aplicación run-app de gril -cp E: / workspace / AppDomain.jar
Necesitarás un mecanismo para obtener todas las dependencias de Maven como argumento de clase de acceso.
He probado con una clase de dominio JPA de ejemplo y esto funciona.
Simplemente coloque los archivos de mapeo en grails-app / conf / hibernate y coloque los archivos Java en src / java o (si el modelo de dominio está almacenado en un JAR) las clases empaquetadas en el directorio lib del proyecto.
No vi tu jar en el directorio lib
en tu código fuente. ¿Podría ser esto?