Вопрос

Я новичок в 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> 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top