Оболочка Grails не видит доменные объекты - PullRequest
6 голосов
/ 11 января 2010

Я новичок 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

Что я сделал не так в этот раз?

Ответы [ 3 ]

2 голосов
/ 11 января 2010

Я второй совет Берта, чтобы использовать консоль вместо оболочки. По поводу исключения:

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()
}
2 голосов
/ 11 января 2010

Вам нужен пакет, поскольку возможно (но не очень хорошая идея) иметь два класса домена с одинаковым именем в разных пакетах.

Для 2-го сеанса это должен быть foo.save (), а не foo.save.

Я предпочитаю консоль, с ней намного проще работать. Запустите консоль Grails, и приложение Swing запустится. Он немного отличается от обычной консоли Groovy тем, что у него есть неявная переменная 'ctx', которая является контекстом приложения Spring. Вы можете использовать это для доступа к сервисам и другим компонентам Spring через "ctx.getBean ('fooService')"

1 голос
/ 11 января 2010

вам нужно будет 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> 
...