Оболочка Grails не видит доменные объекты

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

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


person Brandon Yarbrough    schedule 11.01.2010    source источник


Ответы (3)


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

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()
}
person Dónal    schedule 11.01.2010
comment
Да, withTransaction отлично работает. Интересно, зачем мне это добавлять. Примеры в Интернете, кажется, не упоминают об этом. - person Brandon Yarbrough; 11.01.2010
comment
Вам не нужно добавлять это, но я подумал, что это может решить вашу проблему. Запустив свой код в транзакции, вы принудительно создаете сеанс гибернации (который в противном случае отсутствует). - person Dónal; 12.01.2010

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

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

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

person Burt Beckwith    schedule 11.01.2010
comment
Спасибо, добрый совет! P.S. У меня есть еще один вопрос, save () вызывает исключение Hibernate. Предложения? - person Brandon Yarbrough; 11.01.2010
comment
Кроме того, похоже, что ctx также доступен в моей оболочке. Может в 1.2 добавили? - person Brandon Yarbrough; 11.01.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> 
person Colin Harrington    schedule 11.01.2010
comment
Аааа, я знал, что сохранение - это метод, но я достаточно новичок, чтобы не знать, что я не могу вызвать метод без скобок :) Вы знаете, что случилось с исключением сеанса Hibernate, которое я сейчас вижу? - person Brandon Yarbrough; 11.01.2010