Оболочка Grails не видит объекты домена
-
19-09-2019 - |
Вопрос
Я новичок в Grails (и отличный новичок) и прорабатываю несколько руководств по Grails.Для меня, как для нового пользователя, оболочка Grails — действительно полезный маленький инструмент, но я не могу понять, как заставить ее видеть мои классы и объекты.Вот что я пытаюсь:
% grails create-app test
% cd test
% grails create-domain-class com.test.TestObj
% grails shell
groovy:000> new TestObj()
ERROR org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed, groovysh_evaluate: 2: unable to resolve class TestObj
У меня сложилось впечатление, что оболочка Grails может видеть все контроллеры, службы и объекты домена.Что с этим случилось?Нужно ли мне здесь делать что-то еще?
Я попробовал еще одну вещь:
groovy:000> foo = new com.test.TestObj();
===> com.test.TestObj : null
groovy:000> foo.save
ERROR groovy.lang.MissingPropertyException: No such property: save for class: com.test.TestObj
Что я делаю не так?
РЕДАКТИРОВАТЬ:Хорошо, я видел ответы об использовании полного имени, а также об использовании .save()
вместо .save
.Но как насчет этого?
groovy:000> new com.test.TestObj().save()
ERROR org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
Что я сделал не так на этот раз?
Решение
Я поддерживаю совет Берта использовать консоль вместо оболочки.По поводу исключения:
groovy:000> new com.test.TestObj().save()
ERROR org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
Можете ли вы попробовать явно запустить этот код с транзакцией:
import com.test.TestObj
TestObj.withTransaction{ status ->
TestObj().save()
}
Другие советы
Вам нужен пакет, поскольку возможно (но это не очень хорошая идея) иметь два доменных класса с одинаковым именем в разных пакетах.
Для второго сеанса это должна быть foo.save(), а не foo.save.
Я предпочитаю консоль, с ней намного проще работать.Запустите консоль Grails, и приложение Swing запустится.Она немного отличается от обычной консоли Groovy тем, что в ней имеется неявная переменная «ctx», которая является контекстом приложения Spring.Вы можете использовать это для доступа к сервисам и другим bean-компонентам Spring через «ctx.getBean('fooService')»
тебе придется import com.test.TestObj
или сослаться на него new com.test.TestObj()
как вы показали.
Обратите внимание, что 'save
' — это не свойство, а динамический метод, которым Grails украшает доменный класс во время выполнения.
groovy:000> foo = new com.test.TestObj();
===> com.test.TestObj : null
groovy:000> foo.save()
===> com.test.TestObj : 2
groovy:000>