Использование классов домена JPA в Grails - PullRequest
21 голосов
/ 15 июня 2011

Я хочу использовать модель домена JPA в приложении, разработанном с использованием последней версии Grails (2.0.0.M1).Классы домена JPA находятся в каталоге src\java приложения.

На основе этого сообщения в блоге , которое описывает, как использовать существующую модель домена JPA в приложении Grails, которое я создал grails-app/conf/hibernate/hibernate.cfg.xml со списком моих аннотированных JPA классов.

Если кому-то достаточно скучно хотеть запустить приложение самостоятельно, оно доступно здесь .При запуске приложения возникает следующая ошибка при запуске

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

Любопытно, что проблема, кажется, вызывается только классами домена, которые имеют отношения с другими классами домена.Если вы удалите все классы домена, кроме SystemProperty (который не относится к другим классам домена), приложение запустится без ошибок.

Ответы [ 3 ]

3 голосов
/ 29 июля 2011

Попробуйте использовать META-INF/persistence.xml ( пример ) (я не знаю, где именно его разместить, но в конечном итоге он должен перейти к WEB-INF/META-INF/persistence.xml и включить туда ваш файл jar (в <jar-file>) элемент). Тогда, конечно, вам понадобятся все соответствующие бобы (например, LocalEntityManagerFactoryBean)

1 голос
/ 03 августа 2011

Если вы посмотрите на скрипты запуска grails ($ GRAILS_HOME $ / bin / grails и $ GRAILS_HOME $ / bin / startGrails), вы можете узнать аргумент classpath, отправляемый в панель запуска приложения grails org.codehaus.groovy.grails.cli.support.GrailsStarter.

Когда вы выполните команду grails generate-all com.model.User, команда grails ожидает, что она будет доступна в исходной папке или в каталоге lib.В вашем сценарии jar доступен как часть зависимости Maven.Эта информация не передается через скрипт запуска grails.Вам необходимо указать эту информацию.

В скрипте запуска есть возможность указать путь к классу.Следовательно, вам нужно вызвать команду grails с параметром classpath, который указывает местоположение jar-файлов.

grails generate-all -cp E: \ workspace \ AppDomain.jar

Вам необходимоупомяните банку с другими командами.Например: grails run-app -cp E: \ workspace \ AppDomain.jar

Вам понадобится механизм для получения всех зависимостей Maven в качестве аргумента classpath.

Я протестировал с примером домена JPAкласс, и это работает.

1 голос
/ 29 июля 2011

Документация 1.3.7 говорит

Просто поместите файлы сопоставления в grails-app / conf / hibernate и либо поместите файлы Java в src / java, либо (еслимодель домена хранится в JAR) упакованные классы в каталоге lib проекта.

Я не увидел ваш jar в каталоге lib в вашем исходном коде.Может ли это быть так?

...